📣 VIP通行证夏日特惠 限时立减$68
查看: 1593| 回复: 15
跳转到指定楼层
上一主题 下一主题
收起左侧

迷宫的小问题,大家帮忙看一下,加大米

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 TonyJang 于 2014-7-2 17:14 编辑

就是找到所有可以从起点到终点的路径,我搜了一下代码:
  1. package org.stack;

  2. public class Maze {
  3.         private static int startI,startJ;//入口坐标
  4.         private static int endI,endJ;//出口坐标
  5.        
  6.         public void start(int startI,int startJ){
  7.                 this.startI=startI;
  8.                 this.startJ=startJ;
  9.         }
  10.         public void end(int endI,int endJ){
  11.                 this.endI=endI;
  12.                 this.endJ=endJ;
  13.         }

  14.         public static void main(String[] args) {
  15.                  int maze[][] ={{2, 2, 2, 2, 2, 2, 2, 2, 2},   
  16.                                         {2, 0, 0, 0, 0, 0, 0, 0, 2},   
  17.                                         {2, 0, 2, 2, 0, 2, 2, 0, 2},   
  18.                                         {2, 0, 2, 0, 0, 2, 0, 0, 2},   
  19.                                         {2, 0, 2, 0, 2, 0, 2, 0, 2},   
  20.                                         {2, 0, 0, 0, 0, 0, 2, 0, 2},   
  21.                                         {2, 2, 0, 2, 2, 0, 2, 2, 2},   
  22.                                         {2, 0, 0, 0, 0, 0, 0, 0, 2},   
  23.                                         {2, 2, 2, 2, 2, 2, 2, 2, 2}};   
  24.                
  25.                 create(maze);

  26.                 Maze cell=new Maze();
  27.                 cell.start(1, 1);
  28.                 cell.end(7, 7);
  29.                
  30.                 visited(maze, startI, startJ);
  31.         }
  32.        
  33.         public static void visited(int[][] cell,int i,int j){
  34.                 cell[i][j]=1;
  35.                 if(i==endI&&j==endJ){
  36.                         System.out.println("走完一条路线");
  37.                         for(int m=0;m<cell.length;m++){
  38.                                 for(int n=0;n<cell[0].length;n++){
  39.                                         if(cell[m][n]==2){
  40.                                                 System.out.print("#");
  41.                                         }else if (cell[m][n]==1) {
  42.                                                 System.out.print("*");
  43.                                         }else {
  44.                                                 System.out.print(" ");
  45.                                         }
  46.                                 }
  47.                                 System.out.println();
  48.                         }
  49.                 }
  50.                
  51.                  //向右
  52.                 if(cell[i][j+1] == 0){
  53.                         visited(cell, i, j+1);
  54.                 }
  55.                 //向下
  56.                 if(cell[i+1][j] == 0){
  57.                         visited(cell, i+1, j);
  58.                 }
  59.                 //向左
  60.                 if(cell[i][j-1] == 0){
  61.                         visited(cell, i, j-1);
  62.                 }
  63.                 //向上
  64.                 if(cell[i-1][j] == 0){
  65.                         visited(cell, i-1, j);
  66.                 }
  67.                
  68.                 cell[i][j]=0;
  69.         }
  70.        
  71.        
  72.         //打印迷宫图
  73.         public static void  create(int[][] maze){
  74.                 for(int i=0;i<maze.length;i++){
  75.                         for(int k=0;k<maze.length;k++){
  76.                                 if(maze[i][k]==2){
  77.                                         System.out.print("#");
  78.                                 }else {
  79.                                         System.out.print(" ");
  80.                                 }
  81.                         }
  82.                         System.out.println();
  83.                 }
  84.         }
  85. }
复制代码
路径张贴之后就不好看了,大家可以再eclipse里运行一下,Here is my Q:
第一次遍历数组到了点A[5,7],再往下就不是0了,接下来改怎么运行呢?我感觉卡住了






上一篇:【第三轮】6.30-7.6 CareerCup 3.6
下一篇:【学JAVA中】问一下八皇后问题,是在看不懂了
推荐
itbwtw 2014-7-5 11:42:33 | 只看该作者
全局:
TonyJang 发表于 2014-7-4 09:43
另外从Maze的第一个点开始就算一直向右遍历吧?右边的点满足为0也轮不到后面的if啊,只有到右边界的时候 ...

我明白你的意思了(虽然我还不知道你的(5,7)是怎么来的)。
你有这个问题的话我还是推荐你看一下我最开始回复的帖子。
下面关于你的这个问题:
抽象的来讲,你的问题是,一个函数在执行完了以后(即执行return ;了以后),程序接下来怎么运行。这个问题很简单,当然回到调用这个函数的地方,运行下一行。只不过递归有一点让人迷惑。
你可以用树来帮助你理解,这个程序向4个方向搜索,所以是一个四叉树(当然实际上不是这样,对墙壁和已经访问过的点不搜索)。调用一次递归函数就是开启一个子树(向右搜),子树搜完以后回到这里,开下一个子树(向下搜),再向左搜,再向上搜,搜完四个方向以后回到上一层,这对于上一层来说相当于搜完了一个方向,上一层会开启下一个方向,那下一个方向又开四个方向。。。。直到visit(1,1)这个函数所开的四个方向(实际上它只开了2个)全部return,整个图遍历结束

所以我引用的你说的这段话是错的,递归不是像你说的这样运作的,你说的是遍历一种线性数据结构,递归是像网一样运作的,它面向的非线性的数据结构(图)。
回复

使用道具 举报

推荐
itbwtw 2014-7-2 22:39:26 | 只看该作者
全局:
本帖最后由 itbwtw 于 2014-7-2 22:42 编辑
readman 发表于 2014-7-2 21:05
他没有标记走过的路径吧???

他用2表示墙壁,用0表示道路,已经走过的用1来表示
在递归函数里,他先用cell(i,j)=1;表示这个点走过了,然后向下搜索,搜完四个方向以后,再cell(i,j)=0;也就是复原。
也许复原这步有点难理解:
他先标记,然后搜索,所以在搜索下一层的时候这一层是标记为1的,如果搜到了最后一层(i==endI&&j==endJ),就把整张图打印,那么其中之前的所有1就能形成通路,如果不是最后一层,就继续向下搜(这一层仍然为1)。最后,如果向四个方向搜索完了,再把这一层标记为0,表示没有走过,这样才不会对上一层产生影响。

p.s.建议在网上找几篇深搜的教程看一看,理解一下什么是深搜。
如果不明白的话,先做这个题:给你N个数,输出这N个数的全排列。
比如给你1 2 3,你就输出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1
如果全排列的问题搞懂了,这个走迷宫的问题也就明白了。
再不明白的话,找一本数据结构的书,看一下图的深度优先遍历,也可以明白。

评分

参与人数 1大米 +3 收起 理由
TonyJang + 3 欢迎来介绍你知道的情况

查看全部评分

回复

使用道具 举报

推荐
readman 2014-7-2 23:19:42 | 只看该作者
全局:
itbwtw 发表于 2014-7-2 22:39
他用2表示墙壁,用0表示道路,已经走过的用1来表示
在递归函数里,他先用cell(i,j)=1;表示这个点走过了 ...

ArrayList<ArrayList<Integer>> result = new  ArrayList<ArrayList<Integer>>();
Arrays.sort(num)
boolean[] visited = new boolean[num.length];
public void rec (int[] num, boolean[] visited, ArrayList<Integer> temp) {
if (temp.size() == num.length)
   result.add(temp);
   return;
}
for(int i = 0 ; i < num.length; i++) {
  if (visited == false) {
    visited[i]  = true;
    temp.add(num[i]);
    rec(num, visited, temp);
[/i][/i][/i][i][i][i]    visited = false;[/i][/i]
[i][i]    temp.remove(temp.size() - 1);
}
}
[/i][/i]

[i][i]- = 大概是这样[/i][/i]

回复

使用道具 举报

🔗
 楼主| TonyJang 2014-7-2 17:14:11 | 只看该作者
本楼:
全局:
本帖最后由 TonyJang 于 2014-7-2 17:15 编辑

复制代码
回复

使用道具 举报

🔗
readman 2014-7-2 17:49:18 | 只看该作者
全局:
- = ..leetcode unique path ii
回复

使用道具 举报

🔗
itbwtw 2014-7-2 19:54:43 | 只看该作者
全局:
看了一遍代码,好像没什么错,不知道楼主遇到了什么问题?
回复

使用道具 举报

🔗
readman 2014-7-2 21:05:22 | 只看该作者
全局:
itbwtw 发表于 2014-7-2 19:54
看了一遍代码,好像没什么错,不知道楼主遇到了什么问题?

他没有标记走过的路径吧???
回复

使用道具 举报

🔗
itbwtw 2014-7-2 23:37:39 | 只看该作者
全局:
readman 发表于 2014-7-2 23:19
ArrayList result = new  ArrayList();
Arrays.sort(num)
boolean[] visited = new boolean[num.lengt ...

我看应该没问题,你运行一下看结果对就行了。
这个弄懂的话,那个迷宫应该就没问题了吧?

补充内容 (2014-7-3 13:39):
我看错了,我还以为你是楼主。。。。
回复

使用道具 举报

🔗
 楼主| TonyJang 2014-7-4 09:17:59 | 只看该作者
全局:
itbwtw 发表于 2014-7-2 22:39
他用2表示墙壁,用0表示道路,已经走过的用1来表示
在递归函数里,他先用cell(i,j)=1;表示这个点走过了 ...

谢谢你的解答!我的问题是第一次递归遍历Maze数组到了点[5,7],再往下就不是0了,接下来改怎么运行呢?这个时候[5,7]就不制成1,而是执行第71行,之后到哪一行呢?
回复

使用道具 举报

🔗
 楼主| TonyJang 2014-7-4 09:43:04 | 只看该作者
全局:
itbwtw 发表于 2014-7-2 22:39
他用2表示墙壁,用0表示道路,已经走过的用1来表示
在递归函数里,他先用cell(i,j)=1;表示这个点走过了 ...

另外从Maze的第一个点开始就算一直向右遍历吧?右边的点满足为0也轮不到后面的if啊,只有到右边界的时候在向下搜索吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表