package 迷宫问题;
public class MiGong {
public static void main(String[] args) {
//创建数组,模拟迷宫
int[][] map=new int[8][7];
//使用一表示墙
//第一行和最后一行置为一
for (int i = 0; i < 7; i++) {
map[0][i]=1;
map[7][i]=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;
//遍历输出
show(map);
// setWay(map,1,1);//递归找路
// show(map);
setWay1(map,1,1);//递归找路
show(map);
}
//使用递归回溯给小球找路
//1.map[1][1]迷宫起点,map[6][5]终点
//2.map[i][j]= 0没有走过,1墙,2通路可以走,3已走过走不通
//3.走迷宫约定走法,下右上左,走不通则回溯
/**
*
* @param map 地图
* @param i 哪个位置开始找
* @param j 哪个位置开始找
* @return 找到通路则返回true
*/
public static boolean setWay(int[][] map,int i,int j){
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{//map[i][j]=1,2,3
return false;
}
}
}
// 上右下左
public static boolean setWay1(int[][] map,int i,int j){
if(map[6][5]==2) {//终点,成功
return true;
}else{
if(map[i][j]==0){//没有走过
//按照走法走
map[i][j]=2;//假定该点可以走通
if(setWay1(map,i-1,j)){//上走
return true;
}else if(setWay1(map,i,j+1)){//右走
return true;
}else if(setWay1(map,i+1,j)){//下走
return true;
}else if(setWay1(map,i,j-1)){//左走
return true;
}else{
//说明该点走不通,死路
map[i][j]=3;
return false;
}
}else{//map[i][j]=1,2,3
return false;
}
}
}
//遍历输出
public static void show(int[][] map){
System.out.println("地图情况:");
for(int rows[]:map){
for(int data:rows){
System.out.print(data+" ");
}
System.out.println();
}
}
}