05-递归回溯-迷宫问题

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();
    }
}

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值