Городской план написать без использования рекурсии - 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; - завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д