USTCOJ 1371 island计数

这其实是一道遍历题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;
}


你可能感兴趣的:(USTCOJ 1371 island计数)