【题目】假设以二维数组g[1…m][1…n]表示一个图像
区域,g[i][j]表示该区域中点(i,j)所具颜色,其值
为从0到k的整数。试编写递归算法,将点(i0,j0)所在
区域的颜色置换为颜色c。约定与(i0,j0)同色的上、
下、左、右的邻接点为同色区域的点。
表示图像区域的类型定义如下:
typedef char GTYPE[m+1][n+1];
实现下列函数:
void ChangeColor(GTYPE g, int m, int n,
char c, int i0, int j0);
/* 在g[1…m][1…n]中,将元素g[i0][j0] /
/ 所在的同色区域的颜色置换为颜色c */
递归算法主要是在理解递归边界(以及去重),读者可以通过汉诺塔问题加深该认识;
答案仅供参考:
void ChangeColor(GTYPE g, int m, int n,
char c, int i0, int j0) {
//简单的错误检查
if(m<0||n<0||i0<1||j0<1||g[i0][j0]==c) {
} else {
char swap = g[i0][j0];
g[i0][j0] = c;
//上左右下递归修改,当然也可以上下左右位置互换
if(i0>1&&g[i0-1][j0]==swap) {
ChangeColor(g,m,n,c,i0-1,j0);
}
if(j0>1&&g[i0][j0-1]==swap) {
ChangeColor(g,m,n,c,i0,j0-1);
}
if(j0<n&&g[i0][j0+1]==swap) {
ChangeColor(g,m,n,c,i0,j0+1);
}
if(i0<m&&g[i0+1][j0]==swap) {
ChangeColor(g,m,n,c,i0+1,j0);
}
}
}