这其实是一道遍历题http://acm.ustc.edu.cn/ustcoj/problem.php?id=1371。深度优先搜索或者广度优先搜索都行。
下面的代码是深度优先搜索的代码。其中用到了一个小技巧,即将存储地图的数组开大一些,人为的设置一个值为0的边界,省去数组边界的检查。代码如下:
#include <stdio.h>
#include <string.h>
#define N 55
int a[N][N];
void searchIsland(int i, int j)
{
if (a[i][j] == 0)
return;
a[i][j] = 0;
for (int x = i -1; x <= i+1; ++x)
{
for (int y = j-1; y <= j+1; ++y)
{
searchIsland(x, y);
}
}
}
int main()
{
int w, h;
while (scanf("%d%d", &w, &h), w + h)
{
int i, j;
//将a数组初试话为全0,在读入数据时从a[1][1]开始,
//人为的制造一个边界,省去处理边界的特殊情况。
memset(&a[0][0], 0, sizeof(a[0][0])*N*N);
for (i = 1; i <= h; i++)
{
for (j = 1; j <= w; j++)
scanf("%d", &a[i][j]);
}
int landcount = 0;
for (i = 1; i <= h; i++)
{
for (j = 1; j <= w; j++)
{
if (a[i][j])
{
landcount++;
searchIsland(i, j);
}
}
}
printf("%d\n", landcount);
}
return 0;
}