【问题描述】着色问题。
图像通常使用点阵来表示,相同颜色的点使用同样的数字表示,如图a,所有标记为1的格子表示同一种颜色。当将某个颜色区域内的一点使用其他颜色代替后,该区域内的其他点也要一起被改变,如图b所示。
这里是利用回溯法,
算法描叙
1.先确定一点存入栈中,
2.然后在从东西南北四个方向分别寻找与这一
点相同的点.找到之后再次存入栈中,将这一点用新的颜色替代.
3.然后再去找下一个点,当东西南北四个方向都找不到的时候,
在将栈中的元素出栈.将出栈的元素作为当前点.
4.然后在继续找
java代码:
import java.awt.Point;
import java.util.Stack;
public class Main {
//画布
private static int[][] map = new int[][]{
{3,3,3,3,3,2,1,1,1,1},
{3,3,2,3,1,2,2,1,1,1},
{2,3,2,3,1,1,1,2,2,1},
{2,3,2,2,2,2,1,2,3,3},
{2,3,2,2,2,2,1,3,3,3},
{1,3,2,2,1,1,1,3,3,3},
{1,1,2,1,1,1,1,3,2,3},
{1,1,2,2,2,1,3,3,2,3},
{1,1,1,1,2,1,3,2,2,3},
{1,1,1,1,2,2,3,3,3,3}
};
public static void main(String[] args){
changeColor(map, new Point(9, 9), 4);
for(int i=0;i<map.length;i++){
for(int j=0;j<map[i].length;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
/**
* 改变颜色
* @param map 画布
* @param point 当前点击的点
* @param color 颜色
*/
public static void changeColor(int[][] map,Point point,int color){
int index = map[point.x][point.y];
Stack<Point> stack = new Stack<Point>(); //创建一个栈
stack.push(point); //把第一个点加入栈中
while(!stack.isEmpty()){
//向东移动一步
if(point.y<map[point.x].length-1&&map[point.x][point.y+1] == index){
map[point.x][point.y+1] = color;
point = new Point(point.x, point.y+1);
stack.push(point);
}
//向南移动一步
else if(point.x<map.length-1&&map[point.x+1][point.y] == index){
map[point.x+1][point.y] = color;
point = new Point(point.x+1,point.y);
stack.push(point);
}
//向西移动一步
else if(point.y>0&&map[point.x][point.y-1] == index){
map[point.x][point.y-1] = color;
point = new Point(point.x,point.y-1);
stack.push(point);
}
//向北移动一步
else if(point.x>0&&map[point.x-1][point.y] == index){
map[point.x-1][point.y] = color;
point = new Point(point.x-1,point.y);
stack.push(point);
}else{
point = stack.pop();
}
}
}
}
原文:http://blog.csdn.net/qq_22605739/article/details/44625863