说明:
1)小球得到的路径,和程序员设置的找路策略有关即: 找路的上下左右的顺序相关
2)再得到小球路径时, 可以先使用(下右上左),再改成(上右下左),看看路径是不是有变
3)测试回溯现象
4)思考: 如何求出最短路径?
代码实现:
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 = 1; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println("");
}
System.out.println("-----------------------------");
setWay(map, 1, 1);
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println("");
}
}
//使用递归回溯来给小球找路
/**
*
* @param map 表示地图
* @param i 从哪个位置开始找x坐标
* @param j 从哪个位置开始找y坐标
* @return 如果找到通路,返回true,否则返回false
*/
public static boolean setWay(int[][] map, int i,int j){
//终点为 map[6][5]
//当 map[i][j]为 0 时 表示该点没有被走过
// 为 1表示墙, 2是通路,可以走, 3表示已经走过,但是走不通
//在走迷宫时要确定一个策略:下->右->上->左,如果该点走不通再回溯
if (map[6][5]==2){ //通路已经找到
return true;
}else {
if (map[i][j]==0){//当前节点没有走过
//按照策略 下->右->上->左 走
map[i][j] = 2; //假定该点是可以走通的
if (setWay(map,i+1,j)){//向下走
return true;
}else if (setWay(map,i,j+1)){//向右走
return true;
}else if (setWay(map,i-1,j)){//向上走
return true;
}else if (setWay(map,i,j-1)){//向左走
return true;
}else {
//说明该点走不通,是死路
map[i][j] = 3;
return false;
}
}else { //可能是1(墙),2(走过),3(死路)
return false;
}
}
}
}
更改策略:
public static boolean setWay2(int[][] map, int i,int j){
//终点为 map[6][5]
//当 map[i][j]为 0 时 表示该点没有被走过
// 为 1表示墙, 2是通路,可以走, 3表示已经走过,但是走不通
//在走迷宫时要确定一个策略:上->右->下->左,如果该点走不通再回溯
if (map[6][5]==2){ //通路已经找到
return true;
}else {
if (map[i][j]==0){//当前节点没有走过
//按照策略 上->右->下->左 走
map[i][j] = 2; //假定该点是可以走通的
if (setWay2(map,i-1,j)){//向上走
return true;
}else if (setWay2(map,i,j+1)){//向右走
return true;
}else if (setWay2(map,i+1,j)){//向下走
return true;
}else if (setWay2(map,i,j-1)){//向左走
return true;
}else {
//说明该点走不通,是死路
map[i][j] = 3;
return false;
}
}else { //可能是1(墙),2(走过),3(死路)
return false;
}
}
}