Инструменты пользователя

Инструменты сайта


Боковая панель

Связь

reshenie_zadachi_4

Задача 4

Имеется матрица (n*m) заполненная 1 и 0. Единицы - это острова, а нули - море. Если единицы находятся рядом по горизонтали или вертикали - то они образуют один остров. Острова могут быть «гнутыми» и «дырявыми». Найти количество островов.

/* 
 * File:   landcount.cpp
 * Author: darkfire
 *
 * Created on September 24, 2010, 8:45 PM
 */

#include <stdlib.h>
#include <iostream>

using std::endl;
using std::cin;
using std::cout;

const int SIZEX=6, SIZEY=6;

int endrow(int [][SIZEY], int, int);

int main() {
    int ar[SIZEX][SIZEY];
    int countland = 0;
    //заполнение массива ar
    for (int x=0;x<SIZEX-1;x++)
    {
        cout<<"\n";
        for (int y=0;y<SIZEY-1;y++){
            ar[x][y] = rand()%2;
            cout<<ar[x][y]<<"\t";
        }
    }
    cout<<"\n\n";
    //поиск островов
    for (int x=0;x<SIZEX-1;x++){
        cout<<"\n";
        for (int y=0;y<SIZEY-1;y++){
            if (ar[x][y] ==1){
                countland++;
                endrow(ar,x,y);
            }
        }
    }
    //вывод массива после поиска
        cout<<"\n\n";
    for (int x=0;x<SIZEX-1;x++){
        cout<<"\n";
        for (int y=0;y<SIZEY-1;y++){
            cout<<ar[x][y]<<"\t";
        }
    }
        cout<<"\n"<<"Kol-vo land: "<<countland<<endl;
        return (EXIT_SUCCESS);
}

int endrow(int arrb[][SIZEY], int x, int y)
{
    arrb[x][y]=3;//пометили, что часть острова найдена
    //исследуем вправо и вниз от помеченной точки, рекурсивно вызывая функцию endrow
    if (arrb[x][y+1]==1){
        endrow(arrb,x,y+1);
    };
        if (arrb[x+1][y]==1){
        endrow(arrb,x+1,y);
    };
}

reshenie_zadachi_4.txt · Последние изменения: 2010/10/16 06:56 (внешнее изменение)