天天看點

簡易版種子填充算法(C語言實作)

種子填充算法

填充算法是計算機算法的一種分類,是一個将指定不規則區域内部像素填充為填充色的過程,在計算機輔助設計和圖像處理等領域有廣泛應用。包括了注入填充區域算法、種子填充算法、掃描線填充算法、邊填充算法等。

練習

題目:在一張二維地圖上找到共有幾個島嶼?(來自《啊哈!算法》)

代碼如下:

#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;
}
           

運作結果如下:

簡易版種子填充算法(C語言實作)