種子填充算法
填充算法是計算機算法的一種分類,是一個将指定不規則區域内部像素填充為填充色的過程,在計算機輔助設計和圖像處理等領域有廣泛應用。包括了注入填充區域算法、種子填充算法、掃描線填充算法、邊填充算法等。
練習
題目:在一張二維地圖上找到共有幾個島嶼?(來自《啊哈!算法》)
代碼如下:
#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;
}
運作結果如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL0EleNJTQU9EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwQjN3QTNzAjMxIzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)