ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

小球走迷宫

2022-02-18 12:04:24  阅读:185  来源: 互联网

标签:10 map int 小球 迷宫 走过 public row


  1 //设置一个迷宫10X10,令小球自动走出去(递归)
  2 /*
  3 思路
  4 1.利用一个二维数组map来表示地图,初始位置是(1,1)
  5 2.数组各个值的含义
  6   0表示没走过待测定,1表示走过且测定为障碍物
  7   2表示走过且测定是通行的,3代表走过但是是死路
  8 3.找路方法findway()返回值为真代表找到路,为假代表是没路
  9 */
 10 
 11 public class Test{
 12     public static void main(String[] args) {
 13         int[][] map = new int[10][10];
 14         int row = 0;int col = 0;
 15         //最外一层是围墙,需要设为1
 16         //上下两个围墙
 17         for (;row <= 9;row++){
 18             map[0][row] = 1;
 19             map[9][row] = 1;
 20         }
 21         //左右两个围墙
 22         for(col = 1;col <= 8;col++){
 23             map[col][0] = 1;
 24             map[col][9] = 1;
 25         }
 26         //随机障碍物设置10个
 27         //障碍物不能是map[8][8],不能是围墙,不能是初始化位置map[1][1]
 28         int obsNum = 0;
 29         for(;obsNum < 11;){
 30         for(;;){
 31         row = (int)(Math.random()*7 + 1);//只能取1---8范围
 32         if(row == 0)
 33             continue;
 34         else break;
 35         }
 36         for(;;){
 37         col = (int)(Math.random()*7 + 1);
 38         if(col == 0)
 39             continue;
 40         else break;
 41         }
 42         //如果是map[8][8],map[1][1]则直接重来,如果当前坐标已经是障碍物,也重来
 43         if((row == 8 && col == 8) || (row == 1 && col == 1))
 44             continue;
 45         else if(map[col][row] == 1)
 46             continue;
 47         else{
 48             map[col][row] = 1;
 49             obsNum++;
 50         } 
 51         }
 52         //输出地图
 53         System.out.println("\n====迷宫地图如下====\n");
 54         for(col = 0;col <= 9;col++){
 55             for(row = 0;row <=9;row++){
 56                 System.out.print(map[col][row] + " ");
 57             }
 58             System.out.println();
 59         }
 60 
 61         //找路
 62         FindWay way = new FindWay();
 63         //若有通路,输出地图,否则显示没有
 64         if(way.findWay(map,1,1)){
 65             System.out.println("\n====通路已找到====\n");
 66             for(col = 0;col <= 9;col++){
 67             for(row = 0;row <= 9;row++){
 68                 System.out.print(map[col][row] + " ");
 69             }
 70             System.out.println();
 71         }
 72         }else{
 73             System.out.println("\n====抱歉,没有通路====");
 74         }
 75         
 76     }
 77 }
 78 
 79 
 80 class FindWay{
 81     //(col,row)为初始位置坐标
 82     public boolean findWay(int[][] map,int col,int row){
 83         //要确定怎么测试路径,并且什么时候才代表找到路
 84         //用回溯算法,即试探法
 85         //利用递归来测试路径,每一次递归是在探测下一步的情况,递归的套环就像是走了一步又一步
 86         //或者数学角度来说,递归函数的结构就像是树状图,也就是把所有可能列了出来
 87         //方法开头要先验证,map[8][8]变为2时证明已经走到出口,当前步为一证明是障碍物,不能立足
 88         //若当前步不是障碍物,先假定当前步为2,if(findWay(...)),一直递归,
 89         /*找路策略,下----右----上----左
 90             上下方向相邻或者左右方向相邻明显是很低效的做法,
 91              因为总会做一步无意义的判断,来判断出上一步是走过的2,
 92             要知道上一步不用判断就知道是2了,不是2就不能立足探测*/
 93         //如果上下左右四个方向的下一步中有出现不是障碍物或死路的,那么当前路就是2了
 94         //每一步都可以选择探测上下左右,如果全都不行,那么当前map[][]赋值为3就是说这是死路
 95         //如果一直是有可以走的方向,则一直返回true,这样最后这一条套环就全是2,那就是通路
 96         //如果中间有障碍物,那么这一条套环会有3,3这一步的函数会返回假植给上一步,上一步则继续进行其他方向的探测
 97 
 98         if(map[8][8] == 2)
 99             return true;
100         //测试当前步是不是障碍物,不是的话就可以立足并进行下一步测量
101         if(map[col][row] != 0)
102          return false;
103         else{
104             //假定当前步为2
105             map[col][row] = 2;
106             //向下探测,若下一步是障碍物或者死路,返回假植,进行当前步的其他方向的探测
107             if(findWay(map,col + 1,row))
108                 return true;
109             //向右
110             if(findWay(map,col,row + 1))
111                 return true;
112             //向上
113             if(findWay(map,col - 1,row))
114                 return true;
115             //向左
116             if(findWay(map,col,row - 1))
117                 return true;
118             //四个方向的下一步都不行,那当前步为死路
119             else {
120                 map[col][row] = 3;122                 return false;
123             }
124         }
125     }
126 }

 

标签:10,map,int,小球,迷宫,走过,public,row
来源: https://www.cnblogs.com/codemelo/p/15908017.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有