1.迷宫问题
说明:
1)小球得到的路径,和程序员
设置的找路策略有关即:找
路的上下左右的顺序相关
3)测试回溯现象
代码实现
public class Maze {
public static void main(String[] args) {
//二维数据模拟迷宫
int map[][]=new int [8][7];
//使用1 表示墙
//上下设为1
for(int i=0;i<7;i++) {
map[0][i]=1;
map[7][i]=1;
}
//左右设为1
for(int i=0;i<8;i++) {
map[i][0]=1;
map[i][6]=1;
}
//设置挡板用1表示
map[3][1]=1;
map[3][2]=1;
map[2][2]=1;
System.out.println("迷宫原始状态");
printMap(map);
//使用递归回溯给小球招录
setWay(map, 1, 1);
//输出新的地图,小球走过,并标识过的路径
System.out.println("====走过的路径图====");
printMap(map);
}
//使用递归回溯给小球找路
//1. map表示地图
//2. i,j 表示从地图的哪个位置出发(1,1)
//3. 如果能找到map[6][5] 位置,则说明,通路找到
//4. 约定:当map[i][j]为0,表示该点没有走过, 当为1 表示墙, 2:通路可以走
// 3:表示该点已经走过,但是走不通
// 5. 在走迷宫时,需要确定一个策略(方法) 下--> 右 --> 上 -->左, 如果该点走不通,再回溯
/**
*
* @param map 地图
* @param x 从哪个位置开始
* @param y
* @return 如果找到通路,返回true,否则返回false
*/
public static boolean setWay(int [][]map,int x,int y) {
if(map[6][5]==2) {
return true;
}else {
if(map[x][y]==0) { //当前点还没走过
//策略(方法) 下--> 右 --> 上 -->左
map[x][y]=2; //假定该点可以走通
if(setWay(map,x+1,y)) { //向下
return true;
}else if(setWay(map,x,y+1)) { //向右
return true;
}else if(setWay(map, x-1, y)) { //向上
return true;
}else if(setWay(map,x,y-1)) { //向左
return true;
}else {
//说明这点走不通,是死路
map[x][y]=3;
return false;
}
}else {
// 如果map[x],[y] !=0 可能是1,2,3
return false;
}
}
}
//打印迷宫状态
private static void printMap(int[][] map) {
int row=map.length;
int col=map[0].length;
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
}
运行结果: