Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 12.05.2018
Сообщений: 77
1

Подсчитать количество грядок на садовом участке

26.02.2020, 10:16. Показов 3217. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прямоугольный садовый участок шириной N и длиной M метров разбит на квадраты со стороной 1 метр. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям:

из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону;
никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается).
Подсчитайте количество грядок на садовом участке.
5 10
Код
##......#.
.#..#...#.
.###....#.
..##....#.
........#.
3

5 10
Код
##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####
5


Программа не работает корректно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int N, M;
char Beds[201][201];
void Recursive(int i, int j)
{
    Beds[i][j] = '.';
    if ((j < M) && (Beds[i][j + 1] == '#')) Recursive(i, j + 1);//вправо
    if ((j > 1) && (Beds[i][j - 1] == '#')) Recursive(i, j - 1);//влево
    if ((i < N) && (Beds[i + 1][j] == '#')) Recursive(i + 1, j);//вниз
    if ((i > 1) && (Beds[i - 1][j] == '#')) Recursive(i - 1, j);//вверх
}
int main()
{
    cin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= M; j++)
        {
            cin >> Beds[i][j];
       }
    }
    int Count = 0;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= M; j++)
        {
            if (Beds[i][j] == '#')
            {
                Count++;
                Recursive(i, j);
            }
        }
    }
    cout << Count;
}
Runtime Error...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2020, 10:16
Ответы с готовыми решениями:

Подсчет количества грядок на садовом участке (Pascal -> C++)
Здравствуйте!Задача: Прямоугольный садовый участок шириной N и длиной M метров разбит на...

Валя и Вера на своем садовом участке собрали А кг клубники. Из них В кг собрала Вера.Кто из девочек собрал клубники боль
Валя и Вера на своем садовом участке собрали А кг клубники. Из них В кг собрала Вера.Кто из девочек...

Подсчитайте количество грядок на садовом участке
Господа, помогите. Все написала, а вот в чем дело понять не могу! Вот, собственно, задача:...

Составьте программу расчета количества грядок на садовом участке
Грядки. Садовый участок, имеющий прямоугольную форму и разбитый на квадратные клетки со стороной...

7
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
26.02.2020, 10:30 2
Цитата Сообщение от borisboris1 Посмотреть сообщение
Runtime Error...
попробуйте так:
(исправил места, где могут быть вылеты за границы массива)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int N, M;
char Beds[201][201];
void Recursive(int i, int j)
{
    Beds[i][j] = '.';
    if ((j < M-1) && (Beds[i][j + 1] == '#')) Recursive(i, j + 1);//вправо
    if ((j >   1) && (Beds[i][j - 1] == '#')) Recursive(i, j - 1);//влево
    if ((i < N-1) && (Beds[i + 1][j] == '#')) Recursive(i + 1, j);//вниз
    if ((i >   1) && (Beds[i - 1][j] == '#')) Recursive(i - 1, j);//вверх
}
int main()
{
    cin >> N >> M;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> Beds[i][j];
       }
    }
    int Count = 0;
    for (int i = 1; i < N-1; i++)
    {
        for (int j = 1; j < M-1; j++)
        {
            if (Beds[i][j] == '#')
            {
                Count++;
                Recursive(i, j);
            }
        }
    }
    cout << Count;
}
0
0 / 0 / 0
Регистрация: 12.05.2018
Сообщений: 77
26.02.2020, 14:29  [ТС] 3
Еще меньше тестов проходит, а если чуть изменить код - все равно на 4 тесте валиться
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
26.02.2020, 15:10 4
Цитата Сообщение от borisboris1 Посмотреть сообщение
все равно на 4 тесте валиться
Про тесты ничо не знаю,
Валится с
Runtime Error...
?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
26.02.2020, 15:31 5
При индексации от 1 до N или M включительно
C++
10
11
12
13
    if ((j < M) && (Beds[i][j + 1] == '#')) Recursive(i, j + 1);//вправо
    if ((j >   1) && (Beds[i][j - 1] == '#')) Recursive(i, j - 1);//влево
    if ((i < N) && (Beds[i + 1][j] == '#')) Recursive(i + 1, j);//вниз
    if ((i >   1) && (Beds[i - 1][j] == '#')) Recursive(i - 1, j);//вверх
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
26.02.2020, 15:33 6
dfs

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iterator>
#include <string>
#include <iostream>
#include <algorithm>
 
class LMap
{
    size_t mRows;
    size_t mCols;
    bool* pData;
    bool* pPath;
 
    void dfs(size_t r, size_t c) {
        static const int8_t dx[]{ 1, 0, -1, 0 };
        static const int8_t dy[]{ 0, -1, 0, 1 };
        pPath[r * mCols + c] = true;
        for (uint8_t i(0); i < 4; ++i) {
            size_t rNext = r + dx[i];
            size_t cNext = c + dy[i];
            if (rNext < mRows && cNext < mCols && pData[rNext * mCols + cNext] && !pPath[rNext * mCols + cNext])
                dfs(rNext, cNext);
        }
    }
 
public:
    ~LMap() {
        delete[] pPath;
    }
 
    LMap(bool* begin, size_t rows, size_t cols) :
        pData(begin),
        mRows(rows),
        mCols(cols),
        pPath(new bool[rows * cols])
    {
        std::fill(pPath, pPath + rows * cols, false);
    }
 
    size_t operator ()() {
        size_t cnt(0);
        for (size_t i = 0; i < mRows; ++i)
            for (size_t j = 0; j < mCols; ++j)
                if (pData[i * mCols + j] && !pPath[i * mCols + j]) dfs(i, j), ++cnt;
        return cnt;
    }
};
 
int main()
{
    size_t r, c;
    std::cin >> r >> c;
    bool* b = new bool[r * c];
    for (bool* it(b); it != b + r * c; ++it) {
        char ch; std::cin >> ch;
        *it = ch == '#';
    }
 
    std::cout << LMap(b, r, c)();
    delete[] b;
    return 0;
}


Тест Статус Балл Время работы Астрономическое время работы Используемая память
1 OK 0.002 0.004 1925120
2 OK 0.002 0.003 1925120
3 OK 0.002 0.003 1925120
4 OK 0.007 0.009 1916928
5 OK 0.003 0.004 1925120
6 OK 0.003 0.004 1925120
7 OK 0.006 0.007 1925120
8 OK 0.005 0.009
9 OK 0.005 0.006 1925120
10 OK 0.005 0.006 1916928
11 OK 0.004 0.006 1925120
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
26.02.2020, 16:14 7
nalbe666,
с тестами любой отладит, а вы вот попробуйте в слепую!
1
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
26.02.2020, 16:40 8
В стандарте C++ определён порядок вычисления условий в конструкции if?
Потому, что с минимальными изменениями собрал код и на Pascal и на GCC и сдал. Единственные отличия - индексация от 0 и проверка диапазона индексов отдельно от проверки содержимого массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void dfs(int i, int j)
{
    if (i<0)  return;
    if (i>=N) return;
    if (j<0)  return;
    if (j>=M) return;
    if (G[i][j] != '#') return;
 
    G[i][j] = '.';
    dfs(i, j + 1);//вправо
    dfs(i, j - 1);//влево
    dfs(i + 1, j);//вниз
    dfs(i - 1, j);//вверх
}
0
26.02.2020, 16:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2020, 16:40
Помогаю со студенческими работами здесь

Обход в глубину (задача на количество грядок)
Прошу помочь с решением задачи, как уже только не возился с этим кодом, даже не представляю в чем...

Количество операций в заданном участке программы
Здравствуйте. Имеется следующий участок программы: st = n; while (st &gt; 0) {

Какое количество теплоты получил газ на участке
помогите надо срочно решить задачу из ЕГЭ вот текст: 10 моль одноатомного идеального газасначала...

Вводится предложение. Подсчитать количество слов и подсчитать количество букв в самом длинном слове
Неправильно считает количество букв в наибольшем слове. #include &lt;iostream&gt; #include &lt;cstdio&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru