种子填充算法
填充算法是计算机算法的一种分类,是一个将指定不规则区域内部像素填充为填充色的过程,在计算机辅助设计和图像处理等领域有广泛应用。包括了注入填充区域算法、种子填充算法、扫描线填充算法、边填充算法等。
练习
题目:在一张二维地图上找到共有几个岛屿?(来自《啊哈!算法》)
代码如下:
#include <stdio.h>
void dfs(int x, int y,int color);
int map[51][51],book[51][51],m,n,sum = 0;
int main(int argc, const char *argv[])
{
int num,i,j;
num = 0;
printf("请输入地图的大小\n");
scanf("%d %d",&n,&m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
scanf("%d",&map[i][j]);
}
//输入地图
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
//对每一个大于0的值进行染色
if(map[i][j] > 0)
{
num--;//小岛需要染色的编号
book[i][j] = 1;
dfs(i,j,num);
}
}
}
//输出染色后的地图
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
printf("%3d",map[i][j]);
printf("\n");
}
//输出小岛个数
printf("共有%d个小岛\n",-num);
return 0;
}
void dfs(int x, int y,int color)
{
//定义方向数组 上、左、下、右
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int k,tx,ty;
map[x][y] = color;//染色
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(book[tx][ty] == 0 && map[tx][ty] > 0)
{
sum++;
book[tx][ty] = 1;
dfs(tx,ty,color);
}
}
return;
}
运行结果如下: