问题描述:比如给一个岛, 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;
}
//
代码没有写注释,因为思路比较简单,没有用到算法啥的。