Городской план написать без использования рекурсии - C (СИ)
Формулировка задачи:
План города представляет собой прямоугольник, разбитый на n×m квадратиков. Каждый квадратик может быть занят зданием или быть свободным. Если два соседних (по стороне) квадратика заняты зданием, то это — оно и то же здание.
Программа получает на вход два числа n и m, затем идет n строк по m символов в каждой — план города.
"0" обозначает свободную клетку, "1" обозначает здание.
Выведите число зданий на плане.
Нужно написать не применяя рекурсии, я в этом полный чайник, поэтому полагаюсь на вашу поддержку.
Я нашёл алгоритм похожей программы, но не знаю, как его реализовать в СИ
{ссылка удалена}
Помогите, пожалуйста! Решение задачи: «Городской план написать без использования рекурсии»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
void drawHome(int **p, int i, int j, int n, int m) {
p[i][j] = 2;
if ((i + 1 < n) && (p[i + 1][j] == 1))
drawHome(p, i + 1, j, n, m);
if ((j + 1 < m) && (p[i][j + 1] == 1))
drawHome(p, i, j + 1, n, m);
if ((i - 1 >= 0) && (p[i - 1][j] == 1))
drawHome(p, i - 1, j, n, m);
if ((j - 1 >= 0) && (p[i][j - 1] == 1))
drawHome(p, i, j - 1, n, m);
}
int main(void) {
int **p = NULL;
int n, m, i, j;
scanf("%d%d", &n, &m);
p = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
p[i] = (int*)malloc(m * sizeof(int));
}
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", &p[i][j]);
int homeCount = 0;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (p[i][j] == 1)
{
drawHome(p, i, j, n, m);
homeCount++;
}
printf("\nHome count = %d\n", homeCount);
for (i = 0; i < n; i++) {
free(p[i]);
}
free(p);
getchar();
return 0;
}
Объяснение кода листинга программы
- p - указатель на массив указателей на целочисленные переменные, который инициализируется как NULL. Он будет использоваться для хранения информации о городской карте.
- n и m - целочисленные переменные, которые инициализируются с помощью функции scanf(). Они используются для определения размеров карты.
- p = malloc(n sizeof(int)) - выделение памяти под массив указателей на целочисленные переменные.
- *for (i = 0; i < n; i++) { p[i] = malloc(m sizeof(int)); }** - выделение памяти под массив целочисленных переменных для каждого указателя.
- for (i = 0; i < n; i++) - внешний цикл, который проходит по всем ячейкам карты.
- for (j = 0; j < m; j++) - внутренний цикл, который проходит по всем ячейкам карты.
- scanf(
%d, &p[i][j]) - ввод значения в текущую ячейку карты. - int homeCount = 0; - целочисленная переменная для подсчета количества домов.
- drawHome(p, i, j, n, m); - рекурсивный вызов функции для рисования дома в текущей ячейке карты.
- printf(
\nHome count = %d\n, homeCount); - вывод количества домов. - for (i = 0; i < n; i++) { free(p[i]); } - освобождение памяти, выделенной под массив целочисленных переменных.
- free(p); - освобождение памяти, выделенной под массив указателей на целочисленные переменные.
- getchar(); - ожидание нажатия клавиши для завершения программы.
- return 0; - завершение программы.