免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5510 | 回复: 15
打印 上一主题 下一主题

关于迷宫解谜 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-24 12:58 |只看该作者 |倒序浏览
迷宫地图如下,
五角星为起点,正方形为终点,起点和终点随机生成。

需要制作一个自动走迷宫的程序,有些疑问需要和大家探讨

1.如何读入并保存地图模型,
2.如何遍历每个房间

语言不限,主要是思路。。

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
2 [报告]
发表于 2014-10-26 22:58 |只看该作者
这样如何{:3_193:}
1.如何读入并保存地图模型,
按每个房间的开口的不同,用数字编号
将数字存入数组的数组作为地图
2.如何遍历每个房间
用深度/广度优先搜索方法, 基本模型是
  1. sub dfs { # 坐标x,y
  2.     ... # 判断边界
  3.     for (i=1;i<=n;i++){ # 尝试每一种可能
  4.         dfs($new_x,$new_y) # 继续下一步
  5.     }
  6.     ... # 返回
  7. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-10-27 00:26 |只看该作者
到底是走迷宮還是遍歷所有房間?
這是兩個完全不同的問題。
如果是走迷宮,動態規劃就可以。
如果是遍歷,就用樓上的算法。

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
4 [报告]
发表于 2014-10-27 10:49 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2014-11-09 21:54 |只看该作者
回复 3# shimmey


动态规划?怎么理解?

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
6 [报告]
发表于 2014-11-10 16:11 |只看该作者
大神,一点儿也不错,这个问题引起了大家极大的兴趣。
动态规划?怎么规划?
想要知道这样的脚本怎么写?
谢谢 ~ {:2_172:}

回复 3# shimmey


   

论坛徽章:
0
7 [报告]
发表于 2014-11-13 05:34 |只看该作者
本帖最后由 shimmey 于 2014-11-14 14:12 编辑

可以照這個思路來做。
用L表示從起點走出的距離,從0開始,逐漸遞增。
L =0時表示在起點處。
L =1時表示在距離起點一格距離處,當然,要能走到的位置。
依次類推,每一步都保存到起點的距離和路徑。
直到走到終點為止。
循環最多執行的次數與方格的個數相同。
很久沒上網了,回复比較晚,不好意思!
代碼會在寫好之後放上來。

CS群:329355400
点击链接加入群【Computer Science】:http://jq.qq.com/?_wv=1027&k=STufuA

论坛徽章:
0
8 [报告]
发表于 2014-11-17 12:33 |只看该作者
期待回复 7# shimmey


   

论坛徽章:
0
9 [报告]
发表于 2014-11-18 11:26 |只看该作者
  1. #!/usr/bin/perl

  2. #
  3. # Useage: maze.pl
  4. #
  5. #

  6. use strict;
  7. use warnings;

  8. ### main program

  9. my @maze;

  10. # maze structure 0->empty 1->wall
  11. # initialize
  12. for ( my $i = 0; $i <= 8; $i++ ) {
  13.     for ( my $j = 0; $j <= 9; $j++ ) {
  14.         $maze[$i][$j][0] = 0;
  15.         $maze[$i][$j][1] = 0;
  16.     }
  17. }

  18. $maze[0][1][0] = 1;
  19. $maze[0][3][0] = 1;
  20. $maze[0][3][1] = 1;
  21. $maze[0][4][1] = 1;
  22. $maze[0][5][1] = 1;
  23. $maze[0][6][0] = 1;
  24. $maze[0][8][0] = 1;
  25. $maze[0][8][1] = 1;
  26. $maze[0][9][1] = 1;

  27. $maze[1][0][0] = 1;
  28. $maze[1][0][1] = 1;
  29. $maze[1][1][1] = 1;
  30. $maze[1][2][1] = 1;
  31. $maze[1][3][1] = 1;
  32. $maze[1][4][0] = 1;
  33. $maze[1][5][0] = 1;
  34. $maze[1][7][0] = 1;
  35. $maze[1][8][0] = 1;
  36. $maze[1][9][0] = 1;
  37. $maze[1][9][1] = 1;

  38. $maze[2][0][1] = 1;
  39. $maze[2][2][0] = 1;
  40. $maze[2][3][0] = 1;
  41. $maze[2][3][1] = 1;
  42. $maze[2][4][0] = 1;
  43. $maze[2][5][1] = 1;
  44. $maze[2][7][0] = 1;
  45. $maze[2][8][0] = 1;
  46. $maze[2][9][0] = 1;
  47. $maze[2][9][1] = 1;

  48. $maze[3][0][1] = 1;
  49. $maze[3][2][0] = 1;
  50. $maze[3][2][1] = 1;
  51. $maze[3][3][1] = 1;
  52. $maze[3][4][1] = 1;
  53. $maze[3][6][0] = 1;
  54. $maze[3][7][0] = 1;
  55. $maze[3][8][0] = 1;
  56. $maze[3][9][0] = 1;
  57. $maze[3][9][1] = 1;

  58. $maze[4][0][0] = 1;
  59. $maze[4][1][1] = 1;
  60. $maze[4][2][1] = 1;
  61. $maze[4][3][1] = 1;
  62. $maze[4][4][0] = 1;
  63. $maze[4][5][0] = 1;
  64. $maze[4][9][1] = 1;

  65. $maze[5][0][1] = 1;
  66. $maze[5][2][0] = 1;
  67. $maze[5][3][0] = 1;
  68. $maze[5][6][1] = 1;
  69. $maze[5][7][1] = 1;
  70. $maze[5][8][0] = 1;
  71. $maze[5][8][1] = 1;
  72. $maze[5][9][1] = 1;

  73. $maze[6][1][1] = 1;
  74. $maze[6][2][0] = 1;
  75. $maze[6][4][1] = 1;
  76. $maze[6][5][1] = 1;
  77. $maze[6][6][0] = 1;
  78. $maze[6][6][1] = 1;
  79. $maze[6][7][1] = 1;
  80. $maze[6][8][0] = 1;
  81. $maze[6][9][1] = 1;

  82. $maze[7][0][1] = 1;
  83. $maze[7][1][0] = 1;
  84. $maze[7][1][1] = 1;
  85. $maze[7][3][1] = 1;
  86. $maze[7][4][1] = 1;
  87. $maze[7][5][0] = 1;
  88. $maze[7][5][1] = 1;
  89. $maze[7][7][1] = 1;

  90. $maze[8][1][1] = 1;
  91. $maze[8][2][1] = 1;
  92. $maze[8][3][1] = 1;
  93. $maze[8][5][1] = 1;
  94. $maze[8][6][1] = 1;
  95. $maze[8][7][0] = 1;
  96. $maze[8][7][1] = 1;
  97. $maze[8][8][1] = 1;
  98. $maze[8][9][1] = 1;

  99. my %T = (
  100.     0 => [ qw(┌ ─ ┐) ],
  101.     t => [ qw(┌ ┬ ┐) ],
  102.     m => [ qw(├ ┼ ┤) ],
  103.     b => [ qw(└ ┴ ┘) ],
  104.     h => '─', v => '│'
  105. );

  106. #output the maze
  107. # the first line
  108. print $T{'0'}[0];
  109. for (my $i = 0; $i<9; $i++) {
  110.    print $T{'0'}[1],$T{'0'}[1],  $T{'t'}[1];
  111. }
  112. print $T{'0'}[1], $T{'0'}[1], $T{'t'}[2],"\n";
  113. # crosses
  114. for (my $i = 0; $i<9; $i++) {
  115.     print $T{'v'};
  116.     for (my $j =0; $j<9; $j++) {
  117.         print "  ";
  118.         if ($maze[$i][$j][1] == 1) {
  119.             print $T{'v'};
  120.         } else {
  121.             print " ";
  122.         }
  123.     }
  124.     print "  ", $T{'v'}, "\n";
  125.     print $T{'m'}[0];
  126.     for (my $j =0; $j<9; $j++) {
  127.         if ($maze[$i][$j][0] == 1) {
  128.             print $T{'h'}, $T{'h'};
  129.         } else {
  130.             print "  ";
  131.         }
  132.         print $T{'m'}[1];
  133.     }
  134.     if ($maze[$i][9][0] == 1) {
  135.         print $T{'h'}, $T{'h'};
  136.     } else {
  137.         print "  ";
  138.     }
  139.     print $T{'m'}[2], "\n";
  140. }
  141. # the last row
  142. print $T{'v'};
  143. for (my $i=0; $i<9; $i++) {
  144.     print "  ";
  145.     if ($maze[$i][9][1] == 1) {
  146.         print $T{'v'};
  147.     } else {
  148.         print " ";
  149.     }
  150. }
  151. print "  ", $T{'v'}, "\n";
  152. print $T{'b'}[0];
  153. for (my $i=0; $i<9; $i++) {
  154.     print $T{'h'}, $T{'h'}, $T{'b'}[1];
  155. }
  156. print  $T{'h'}, $T{'h'}, $T{'b'}[2], "\n";
复制代码
輸出迷宮,請檢查下有無錯誤。
正在做後面的事情。

论坛徽章:
0
10 [报告]
发表于 2014-11-20 15:15 |只看该作者
本帖最后由 qw0148 于 2014-11-20 15:18 编辑

大神继续,你的代码循环中多了几个空格,我已经帮你改过来了,请在下面的基础上继续.
期待后续大作

这是代码结果:
  1.     #!/usr/bin/perl

  2.     #
  3.     # Useage: maze.pl
  4.     #
  5.     #

  6.     use strict;
  7.     use warnings;

  8.     ### main program

  9.     my @maze;

  10.     # maze structure 0->empty 1->wall
  11.     # initialize
  12.     for ( my $i = 0; $i <= 8; $i++ ) {
  13.         for ( my $j = 0; $j <= 9; $j++ ) {
  14.             $maze[$i][$j][0] = 0;
  15.             $maze[$i][$j][1] = 0;
  16.         }
  17.     }

  18.     $maze[0][1][0] = 1;
  19.     $maze[0][3][0] = 1;
  20.     $maze[0][3][1] = 1;
  21.     $maze[0][4][1] = 1;
  22.     $maze[0][5][1] = 1;
  23.     $maze[0][6][0] = 1;
  24.     $maze[0][8][0] = 1;
  25.     $maze[0][8][1] = 1;
  26.     $maze[0][9][1] = 1;

  27.     $maze[1][0][0] = 1;
  28.     $maze[1][0][1] = 1;
  29.     $maze[1][1][1] = 1;
  30.     $maze[1][2][1] = 1;
  31.     $maze[1][3][1] = 1;
  32.     $maze[1][4][0] = 1;
  33.     $maze[1][5][0] = 1;
  34.     $maze[1][7][0] = 1;
  35.     $maze[1][8][0] = 1;
  36.     $maze[1][9][0] = 1;
  37.     $maze[1][9][1] = 1;

  38.     $maze[2][0][1] = 1;
  39.     $maze[2][2][0] = 1;
  40.     $maze[2][3][0] = 1;
  41.     $maze[2][3][1] = 1;
  42.     $maze[2][4][0] = 1;
  43.     $maze[2][5][1] = 1;
  44.     $maze[2][7][0] = 1;
  45.     $maze[2][8][0] = 1;
  46.     $maze[2][9][0] = 1;
  47.     $maze[2][9][1] = 1;

  48.     $maze[3][0][1] = 1;
  49.     $maze[3][2][0] = 1;
  50.     $maze[3][2][1] = 1;
  51.     $maze[3][3][1] = 1;
  52.     $maze[3][4][1] = 1;
  53.     $maze[3][6][0] = 1;
  54.     $maze[3][7][0] = 1;
  55.     $maze[3][8][0] = 1;
  56.     $maze[3][9][0] = 1;
  57.     $maze[3][9][1] = 1;

  58.     $maze[4][0][0] = 1;
  59.     $maze[4][1][1] = 1;
  60.     $maze[4][2][1] = 1;
  61.     $maze[4][3][1] = 1;
  62.     $maze[4][4][0] = 1;
  63.     $maze[4][5][0] = 1;
  64.     $maze[4][9][1] = 1;

  65.     $maze[5][0][1] = 1;
  66.     $maze[5][2][0] = 1;
  67.     $maze[5][3][0] = 1;
  68.     $maze[5][6][1] = 1;
  69.     $maze[5][7][1] = 1;
  70.     $maze[5][8][0] = 1;
  71.     $maze[5][8][1] = 1;
  72.     $maze[5][9][1] = 1;

  73.     $maze[6][1][1] = 1;
  74.     $maze[6][2][0] = 1;
  75.     $maze[6][4][1] = 1;
  76.     $maze[6][5][1] = 1;
  77.     $maze[6][6][0] = 1;
  78.     $maze[6][6][1] = 1;
  79.     $maze[6][7][1] = 1;
  80.     $maze[6][8][0] = 1;
  81.     $maze[6][9][1] = 1;

  82.     $maze[7][0][1] = 1;
  83.     $maze[7][1][0] = 1;
  84.     $maze[7][1][1] = 1;
  85.     $maze[7][3][1] = 1;
  86.     $maze[7][4][1] = 1;
  87.     $maze[7][5][0] = 1;
  88.     $maze[7][5][1] = 1;
  89.     $maze[7][7][1] = 1;

  90.     $maze[8][1][1] = 1;
  91.     $maze[8][2][1] = 1;
  92.     $maze[8][3][1] = 1;
  93.     $maze[8][5][1] = 1;
  94.     $maze[8][6][1] = 1;
  95.     $maze[8][7][0] = 1;
  96.     $maze[8][7][1] = 1;
  97.     $maze[8][8][1] = 1;
  98.     $maze[8][9][1] = 1;

  99.     my %T = (
  100.         0 => [ qw(┌ ─ ┐) ],
  101.         t => [ qw(┌ ┬ ┐) ],
  102.         m => [ qw(├ ┼ ┤) ],
  103.         b => [ qw(└ ┴ ┘) ],
  104.         h => '─',
  105.                 v => '│'
  106.     );

  107.     #output the maze
  108.     # the first line
  109.     print $T{'0'}[0];
  110.     for (my $i = 0; $i<9; $i++) {
  111.        print $T{'0'}[1],$T{'t'}[1];
  112.     }
  113.     print $T{'0'}[1],$T{'t'}[2],"\n";
  114.     # crosses
  115.     for (my $i = 0; $i<9; $i++) {
  116.         print $T{'v'};
  117.         for (my $j =0; $j<9; $j++) {
  118.             print "  ";
  119.             if ($maze[$i][$j][1] == 1) {
  120.                 print $T{'v'};
  121.             } else {
  122.                 print "  ";
  123.             }
  124.         }
  125.         print "  $T{'v'}\n";
  126.         print $T{'m'}[0];
  127.         for (my $j =0; $j<9; $j++) {
  128.             if ($maze[$i][$j][0] == 1) {
  129.                 print $T{'h'};
  130.             } else {
  131.                 print "  ";
  132.             }
  133.             print $T{'m'}[1];
  134.         }
  135.         if ($maze[$i][9][0] == 1) {
  136.             print $T{'h'};
  137.         } else {
  138.             print "  ";
  139.         }
  140.         print $T{'m'}[2], "\n";
  141.     }
  142.     # the last row
  143.     print $T{'v'};
  144.     for (my $i=0; $i<9; $i++) {
  145.         print "  ";
  146.         if ($maze[$i][9][1] == 1) {
  147.             print $T{'v'};
  148.         } else {
  149.             print "  ";
  150.         }
  151.     }
  152.     print "  ", $T{'v'}, "\n";
  153.     print $T{'b'}[0];
  154.     for (my $i=0; $i<9; $i++) {
  155.         print $T{'h'},$T{'b'}[1];
  156.     }
  157.     print  $T{'h'},$T{'b'}[2], "\n";
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP