着色问题(回溯法)

【问题描述】着色问题。
图像通常使用点阵来表示,相同颜色的点使用同样的数字表示,如图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();
        }
    }
}

}

    原文作者:回溯法
    原文地址: https://blog.csdn.net/qq_22605739/article/details/44625863
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞