[问题] 用 recursive 作闯迷宫的设定 求神支援

楼主: lalawolala (太阳底下无新鲜事)   2014-05-01 07:33:43
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC2012
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
各位大大好 小弟刚学C++ 不久 实在是想不出来脑细胞死太多来请求神手支援了><
题目是要用 recursive 来解老鼠闯迷宫的问题 下面就是一开始的迷宫设定
是一个 data.txt 文件档 首先把这个迷宫的文件档 读进我设定的 array 里面
光这个就google好久才知道怎么设定 dynamic 的二次阵列 这地图上'e'代表出口
一开始的起始点是'm' 我式设定成 char 的二次阵列 另外设定了一个 class cell
里面 private: int x, y; 是要代表座标轴位置用的 我总共宣告了三个 object cell
一个是 entry 起点 一个是 exit 出口 还有一个 current 目前位置 照我原本想的是
从起点开始检察 current 的座标位置 相对应的 array maze[x][y] 如果刚好跟 exit
的座标未置一样 就代表有通路连到出口(结束) 如果不同的话 就检查东西南北四个方
位在迷宫里是 1 还是 0 ,利用 current 里的 x,y 坐标轴的加减来绕地图找出通路 
可是实在不知道怎么正确的设定好这个 recursive ..... 怎么跑都会失败 
应该说是根本就被强迫结束程式...超级灰心的 
我想了好几天了也上网查了好久 但是一直没有灵感 希望有大大能救救我><
!经过 K 大指点 目前已经可以把条件设定成 每经过一个座标就把它改成一个 '.'
然后可以顺利开始绕迷宫 但是发生另一个问题 就是他明明有成功到达出口 却没有
回传 true 跳出 function 反而继续把剩下的迷宫全部走完然后回传 false...
是我设定成功条件的位置有问题吗 \_/ 刚好不容易开心一下马上又自爆了...
我把现在的 code 更新上来 希望能有大大帮我检查一下 无限感激!
喂入的资料(Input):
迷宫设定为
11
11111111111
10000010001
10100010101
e0100000101
10111110101
10101000101
10001010001
11111010001
101m1010001
10000010001
11111111111
'1' 代表墙壁不通行
'0' 代表可通过的路
'e' 代表出口
(迷宫最上面有一个 11 是迷宫的边长 我默认为 11 X 11 的正方形
所以这个 11 只是读入我的 int n 来设定给 dynamic array 用的
不影响迷宫本身)
预期的正确结果(Expected Output):
cout<< success !
错误结果(Wrong Output):
根本被强迫中断....(跑成无穷循环?)
程式码(Code):(请善用置底文网页, 记得排版)
首先是 cell 我把它设定成 library... 不知道这样好不好 
class cell
{
private:
int x;
int y;
public:
cell(){x = 0; y=0;}
void set_x(int a){x = a;}
void set_y(int b){y = b;}
int get_x(){return x;}
int get_y(){return y;}
~cell(){}
};
以下是我的 code
#include <iostream>
#include "Cell.h"
#include <fstream>
#include <ctime>
#include <iomanip >
using namespace std;
bool exitMaze(char **a, int n, int i, int j);
int main()
{
int n;
char **maze;
fstream f;
f.open("data.txt", ios::in);
f >> n;
maze = new char *[n];
for (int i= 0; i < n; ++i) maze[i] = new char[n];
for (int i= 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
f >> maze[i][j];
}
}
f.close();
cell current, entry;
entry.set_x(8);
entry.set_y(3);
current = entry;
int x = entry.get_x(), y = entry.get_y();
if(exitMaze(maze, n, x, y ))
{
cout << "Exit is found!" << endl;
}
else
{
cout << "No exit!" << endl;
}
system("pause");
return 0;
}
bool exitMaze(char** maze, int n, int a, int b)
{
cell exit;
exit.set_x(3);
exit.set_y(0);
if(a == exit.get_x() && b == exit.get_y())
{
return true;
}
else
{
if(maze[a][b+1] != '1' && maze[a][b+1] != '.')
{
maze[a][b+1] = '.';
exitMaze(maze, n, a, b+1);
}
if(maze[a][b-1] != '1' && maze[a][b-1] != '.')
{
maze[a][b-1] = '.';
exitMaze(maze, n, a, b-1);
}
if(maze[a+1][b] != '1' && maze[a+1][b] != '.')
{
maze[a+1][b] = '.';
exitMaze(maze, n, a+1, b);
}
if(maze[a-1][b] != '1' && maze[a-1][b] != '.')
{
maze[a-1][b] = '.';
exitMaze(maze, n, a-1, b);
}
}
return false;
}
补充说明(Supplement):
每次 run 都一定出问题 都快要恐惧症不敢 run 了 ... 真不好意思我知道我的
code 写得不好 感谢各位大大指点迷津了! 希望能赶快变强 我每次都兴高采烈
来写程式解题目 然后都喷一堆问题出来 不过如果最后能解决问题成功跑过真的是
无比的爽快感! 再次感谢大家 
作者: kiedveian (极地之星光)   2014-05-01 08:50:00
第一步往下走,第二步往上走,第三步往下走……啊看错了,不要理我看到问题了,你在走下一步前没设成'.'然后就会变成1楼的来回走
作者: johnpage (johnpage)   2014-05-01 08:55:00
右手法则解题
作者: CaptainH (Cannon)   2014-05-01 09:04:00
先学会 DFS 或 BFS 算法
楼主: lalawolala (太阳底下无新鲜事)   2014-05-01 09:30:00
感谢大家 请问K大 我要在哪里设定 '.' 才可以避免悲剧我只有在最后设定一个 maze[a][b]='.'; 可是没成功recursive 真的是有够难想像的 我快被我自己白痴气死而且我每次执行 他一开始一定会说一句话让我看不懂maze* 0x003a83d8<invalid charaters in string.>不知道是不是我 把 maze 放入 exitMaze 的地方有问题
作者: AndyLeo (打败超越一切的人)   2014-05-01 19:16:00
a+-1跟b+-1 你要判断有没有超过边界
作者: kiedveian (极地之星光)   2014-05-01 19:47:00
呼叫走下一步函式走到终点(回传true)后,并没有任何的处理,而是继续试其他步,试完回传false觉得难想像可以考虑玩玩看 light bot 或许有帮助
楼主: lalawolala (太阳底下无新鲜事)   2014-05-02 12:46:00
感谢K大! 还真的没有在往下一步走后的回传判断 ><Andy大是不是我要先设定a,b的最大值...不过我不会这种设定 @@ 我来 google 看看 感谢您!
作者: kiedveian (极地之星光)   2014-05-02 13:48:00
你的地图包含墙,正常走不会出界andy大的情况是在没墙的状况才要判定
作者: a34021501 (CARD)   2014-05-03 22:37:00
红的明显,你在exit之后要把maze改回原值0如此DFS才会走回来,另外你要判断是否出界Recursive Function: 1.改变状态 2.call自己 3.恢复状态最大值不就是11吗? (0~10)

Links booklink

Contact Us: admin [ a t ] ucptt.com