【代码】
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxSize 100
//定义四个方向
int D[4][2] = { {0,-1} ,{-1,0} ,{0,1} ,{1,0} };
//判断着色区域是否连通
int Check(int a[][maxSize], int m, int n, int x, int y, int oldcolor)
{
//首先判断坐标是否越界,越界返回0
if (x < 0 || x >= m || y < 0 || y >= n)
return 0;
//如果该区域的颜色与种子点颜色不相同则不连通
if (a[x][y] != oldcolor)
return 0;
return 1;
}
//填充算法,a为着色图像,m和n为矩阵的维度,x,y是种子坐标,newcolor是目标颜色,oldcolor是种子区域的颜色
void Flood_Fill(int a[][maxSize], int m, int n, int x, int y, int newcolor, int oldcolor)
{
if (Check(a, m, n, x, y, oldcolor))
{
a[x][y] = newcolor;
int i;
//依次填充四个方向的相邻区域
for (i = 0; i < 4; ++i)
{
Flood_Fill(a, m, n, x + D[i][0], y + D[i][1], newcolor, oldcolor);
}
}
}
int main()
{
int a[maxSize][maxSize];
int m = 8, n = 10;
int i, j;
//初始化图像
printf("Original Picture:\n");
srand(time_t(0));
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
a[i][j] = 0;//rand() % 10
for (i = 2; i < 5; ++i)
for (j = 3; j < 6; ++j)
a[i][j] = 1;
a[1][5] = 1;
a[2][6] = 1;
a[5][4] = a[5][5] = 1;
for (i = 0; i < m; ++i)
{
for (j = 0; j < n; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
//选取种子点
int x = 4, y = 3;
printf("\nSeed:(%d,%d)\n", x, y);
//填充算法
int oldcolor = a[x][y];
Flood_Fill(a, m, n, x, y, 6, oldcolor);
//输出新矩阵
for (i = 0; i < m; ++i)
{
for (j = 0; j < n; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
【结果】