小岛问题

来源:互联网 发布:信号发生器软件 编辑:程序博客网 时间:2024/04/27 23:01

问题描述:比如给一个岛, 1 1 1 1 1 1 1 1     只有0的左右,上下都有1包围的时候才能算做小岛,所以这个图的小岛就是10,即中间封闭的0的格式,而两边的0都是没有封闭的,

                                                 1 0 0 0 0 0 1 1      不可计数。

                                                 1 1 0 0 0 1 1 0

                                                 0 1 0 0 1 1 0 0

                                                 1 1 1 1 1 1 1 1

思考:简单的遍历即可,在处理是否被包围的时候,只需要判断该数的上,下,左右,是否都大于等于1,即有1包围即可。

源代码:

#include <iostream>
using namespace std;
int island[100][100];
int num;
int jude(int x, int y)
{
//判断行
int tmp = 0;
for (int i = 0; i < y; i++)
tmp += island[x][i];
if (tmp < 1)
return 0;
else{
tmp = 0;
for (int i = y; i < num; i++)
if (i == y)
continue;
else
{
tmp += island[x][i];
}
if (tmp < 1)
return 0;
}


tmp = 0;
for (int i = 0; i < x; i++)
tmp += island[i][y];
if (tmp < 1)
return 0;
else{
tmp = 0;
for (int i = x; i < num; i++)
if (i == x)
continue;
else
{


tmp += island[i][y];
}
if (tmp < 1)
return 0;
}
return 1;

}
int main(void)
{
cin >> num;
int tmp;
int count = 0;
int i = 0;
getchar();
for (i = 0; i < num; i++)
for (int j = 0; j < num; j++)
cin >> island[i][j];
int ares = 0;
for (i = 0; i < num; i++)
for (int j = 0; j < num; j++)
{
if (island[i][j] == 0)
{
if (jude(i, j))
ares++;
}
}
cout << ares<<endl;
return 0;
}



//////////////////////////////

代码没有写注释,因为思路比较简单,没有用到算法啥的。

                                  

原创粉丝点击