不止是心血来潮

导航

老鼠出迷宫-java递归

需求:老鼠走迷宫,求出路径,已经走了多少步;

迷宫图如下:1代表是墙壁,0代表路;

 

 

 

 

设计思路:

1、用二维数组画出地图;

 2、用递归的方法代表走路

2.1   10代表可以走的路 ; 1、代表墙壁不能走;2代表即将要走的路 ;3代表走过的路但是走不通

2.2   由于不是要求出最优解;可以用下 右 上 左的策略来走

代码实现:

 

 

public class MiGong{
public static void main(String[] args){
Mytools my = new Mytools();


//画棋盘
int[][] arr = new int[7][8];

for(int i=0;i<arr.length ;i++ ) {
for (int j = 0;j<arr[i].length; j++) {
//第一行和最后一行为1,1代表墙壁不能走
if(i == 0|| i == arr.length-1){
arr[i][j] = 1;
}

else if(i == 3){
if(j == 1||j==2||j==0||j==arr[i].length-1){
arr[i][j] = 1;
}

else{
arr[i][j] = 0;
}
}

//第一列行和最后一列=1,1代表墙壁不能走
else if(j == 0|| j == arr[i].length-1){
arr[i][j] = 1;
}
else{
arr[i][j] = 0;
}
}
}
arr[3][4] = 1;
arr[4][2] = 1;
arr[4][4] = 1;
arr[5][3] = 1;
System.out.println("迷宫的样式: " );
for(int i=0;i<arr.length ;i++ ) {
for (int j = 0;j<arr[i].length; j++) {
System.out.print(arr[i][j]+" " );
}
System.out.println();
System.out.println();
}

//用方法 准备走
my.findWay(arr,1,1);
//查看结果
int step = 0 ;
System.out.println("找路的结果 " );
for(int i=0;i<arr.length ;i++ ) {
for (int j = 0;j<arr[i].length; j++) {
if(arr[i][j] == 2){
step ++;
}
System.out.print(arr[i][j]+" " );
}
System.out.println();
}

System.out.println("需要"+(step-1)+"步");
}
}

class Mytools{

//0代表可以走,1代表障碍物,2代表要走的路,3代表走过了走不通
//X,y代表初始位置
//返回 true 代表找到,否则返回false。
public boolean findWay(int[][] map,int x,int y){
if(map[5][6] == 2){ //的时候说明已经结束
return true;
}

else{
if(map[x][y] == 0){ //的时候说明可以走
//假定能走通
map[x][y] = 2; // 可以走直接先赋值2,代表可以走

//找路策略,先下-》右->左->上
if(findWay(map,x+1,y)){//先走下
return true;
}else if(findWay(map,x,y+1)){//先走右
return true;
}else if(findWay(map,x-1,y)){//走左
return true;
}else if(findWay(map,x,y+1)){//走上
return true;
}else{// 无路可走,之前假定走通的2需要改成3
map[x][y] = 3;
return false;
}

}
else{ //剩余的1、2、3、都是没必要测试的情况,直接返回False
return false;
}
}
//不是0和2的时候直接false 结束不能走

}
}

 

输出:

 

 ps: 感觉代码直接贴上去看着眼睛很累,再附加一张图片吧,这是类、方法 模拟老鼠走路;

 

画棋盘:

 

 

实例化类、调用方法:

 

posted on 2022-01-29 12:04  不止是心血来潮  阅读(343)  评论(0)    收藏  举报