第4章第5节-宝岛探险-Floodfill算法

/*想知道地图中有多少个独立的小岛,并对不同独立小岛染色
从(1,1)开始枚举,一直枚举到(n,m)
*/
#include "stdio.h"
int a[51][51],book[51][51];
int n,m,sum;
void dfs(int x,int y,int color)
{

    //定义一个表示走的方向的数组
    int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//分别表示向右,向下,向左,向上走
    int k,tx,ty;

    a[x][y] = color;//对a[x][y]这个格子进行染色
    //枚举四个方向
    for(k = 0;k <= 3;k++)
    {
        //下一步的坐标
        tx = x + next[k][0];
        ty = y + next[k][1];
        //判断是否是边界
        if(tx < 1 || tx > n || ty < 1 || ty > m)
        {
            continue;
        }
        //判断是否为陆地或已经走过
        if(a[tx][ty] > 0 && book[tx][ty] == 0)
        {
            sum++;
            book[tx][ty] = 1;//标记这个点已经走过
            dfs(tx,ty,color);//开始尝试下一个点
        }
    }
    return;
}

int main()
{
    int i,j,num = 0;
    scanf("%d %d",&n,&m);
    //读入地图
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }

    //对每个大于0的点尝试进行dfs染色
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= m;j++)
        {
            if(a[i][j] > 0)
            {
                num--;//小岛需要染的染色编号,每发现一个小岛应染不同的染色,因此每次都要减1
                book[i][j] = 1;
                dfs(i,j,num);
            }
        }
    }

    //输出已经染色后的地图
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= m;j++)
        {
            printf("%3d",a[i][j] );//%d中的3是c语言中的场宽
        }
        printf("\n");
    }
    //输出小岛的个数
    printf("有%d个小岛\n",-num );
    getchar();getchar();
    return 0 ;
}
/*
示例输入:
10 10
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0 
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
示例输出:
-1  -1  -1   0   0   0   0   0  -2  -2
-1   0  -1   0  -3  -3  -3   0  -2  -2
-1   0  -1   0  -3  -3  -3  -3   0  -2
-1  -1   0   0   0  -3  -3  -3   0   0
 0   0   0   0   0   0  -3  -3  -3   0
 0  -3  -3  -3   0  -3  -3  -3  -3   0
 0  -3  -3  -3  -3  -3  -3  -3  -3   0
 0   0  -3  -3  -3  -3  -3  -3   0   0
 0   0   0  -3  -3  -3  -3   0  -4  -4
 0   0   0   0   0   0   0   0  -4   0
 有4个小岛 
*/

猜你喜欢

转载自blog.csdn.net/perfect_zdq/article/details/89285950