Городской план написать без использования рекурсии - 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;
}

Объяснение кода листинга программы

  1. p - указатель на массив указателей на целочисленные переменные, который инициализируется как NULL. Он будет использоваться для хранения информации о городской карте.
  2. n и m - целочисленные переменные, которые инициализируются с помощью функции scanf(). Они используются для определения размеров карты.
  3. p = malloc(n sizeof(int)) - выделение памяти под массив указателей на целочисленные переменные.
  4. *for (i = 0; i < n; i++) { p[i] = malloc(m sizeof(int)); }** - выделение памяти под массив целочисленных переменных для каждого указателя.
  5. for (i = 0; i < n; i++) - внешний цикл, который проходит по всем ячейкам карты.
  6. for (j = 0; j < m; j++) - внутренний цикл, который проходит по всем ячейкам карты.
  7. scanf(%d, &p[i][j]) - ввод значения в текущую ячейку карты.
  8. int homeCount = 0; - целочисленная переменная для подсчета количества домов.
  9. drawHome(p, i, j, n, m); - рекурсивный вызов функции для рисования дома в текущей ячейке карты.
  10. printf(\nHome count = %d\n, homeCount); - вывод количества домов.
  11. for (i = 0; i < n; i++) { free(p[i]); } - освобождение памяти, выделенной под массив целочисленных переменных.
  12. free(p); - освобождение памяти, выделенной под массив указателей на целочисленные переменные.
  13. getchar(); - ожидание нажатия клавиши для завершения программы.
  14. return 0; - завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы