关于C++迷宫问题,寻找一条通路穿越迷宫(找到一条即可)。要求写出一个递归程序来穿越迷宫。

算法提示是:“摸着右手边的墙跟着其拐弯”用“#”表示墙。“.”表示思路输出要求:走过的路把”."换成“X",每走一步便输出一次新状态下的迷宫。只要思路就好。PS:我是大一... 算法提示是:“摸着右手边的墙跟着其拐弯”
用“#”表示墙。 “.”表示思路
输出要求:走过的路把”."换成“X",每走一步便输出一次新状态下的迷宫。
只要思路就好。
PS:我是大一新生(只学了半年C++),不要用超前的知识。注意要用递归的思想,谢谢!
“ ." 表示通路。
展开
 我来答
冰火梦幻
2014-02-08 · TA获得超过2308个赞
知道小有建树答主
回答量:1095
采纳率:57%
帮助的人:414万
展开全部

题目有问题:如何指定迷宫的起点和终点。

我这里假设迷宫某个边界位置是起点,(x, y)是否是终点要用GotGoal(x, y)函数判断。


核心函数

void DFS(char *m, int height, int width, int x, int y, int now_dir)


这里m是一个一维数组,表示迷宫。格点x, y的信息是m[y * width + x]

比如3行4列的迷宫

####

#...

..##

在m里就是#####.....##,每一行紧接着上一行。


height 迷宫高度

width 迷宫宽度


x是当前位置横坐标。右边是正方向。


y是当前位置纵坐标。下方是正方向。


now_dir是是当前的方向。你需要给上下左右4个方向规定一个编号。

比如

int dir_list[4][2] = {
    {-1, 0}, // 地图左
    {0, -1}, // 地图上
    {1, 0},  // 地图右
    {0, 1}   // 地图下
};
// 第一个数表示恒坐标变化量,第二个数表示纵坐标变化量

那么对于当前方向now_dir,“摸着右手边的墙”的探索方向编号依次是(可以参照上面dir_list的注释来理解)

(now_dir + 1) % 4 当前方向右侧

(now_dir + 0) % 4 当前方向

(now_dir - 1 + 4) % 4 当前方向左侧

(now_dir - 2 + 4) % 4 当前方向反方向(回头)。(这里要+4是为了防止now_dir减去数字后变成负数,负数除以4的余数还是负数)。


使用DFS的方法:

先将地图信息保存到char数组里,作为DFS函数第一参数

将迷宫入口横坐标保存到x参数,纵坐标保存到y参数

将刚进入迷宫的方向的编号(dir_list的第一下标)保存到now_dir


DFS的基本实现(伪代码)

void DFS(char *m, int height, int width, int x, int y, int now_dir)
{
    int turn = 0;
    int new_dir;
    int new_x;
    int new_y;
    if (GotGoal(x, y) ) // 如果当前位置是终点
        return;
    m[y * width + x] = 'X'; // 占据当前位置
    PrintMap(m, height, width); // 打印地图当前状态
    for (turn = 1; >= -2; turn--) // 依次循环4个方向:右、前、左、回头
    {
        new_dir = (now_dir + turn + 4) % 4; // 计算新方向的编号
        new_x = x + dir_list[new_dir][0];
        new_y = y + dir_list[new_dir][1]; // 计算出“如果要走新方向,则下一步的位置”
        if (new_x < 0 || new_x >= width)// 如果走出左右边界
            continue;
        if (new_y < 0 || new_y >= height) // 如果走出上下边界
            continue;
        if ('#' == m[new_y * width + new_x]) // 如果下一步是是墙
            continue;
        DFS(m, height, width, new_x, new_y, new_dir);
    }
    return;
}


注意:

  1. 这个问题由于不涉及最短路,而且每走一步都算走过,包括走进了死胡同。因此这个问题完全不需要用递归,实际上程序也不可能回溯,因为每一步都是对的。直接用for或while循环就行了。用递归,当路线比较长时,可能超过操作系统限制而报错。

  2. 对于有环路的迷宫,程序会死循环。

  3. 如果要判断出死循环的情况,需要一个额外的数组int m_arrived[][4],保存每个位置的每个方向是否走过。一开始都是0,走过m[i]且方向是dir的时候,m_arrived[i][dir] = 1即可。

有不明白的地方请追问。

追问
再问下,我要写一个C++的实验报告,它有个要求是要写程序的使用说明,这包含哪些内容啊?
追答
使用说明只需要写输入哪些数据,会输出哪些结果即可。
mafangsan
2014-02-08 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1万
采纳率:71%
帮助的人:2503万
展开全部
这个问题其实可以看成搜索问题

如果你会用栈或者队列,就可以用深度优先或者广度优先去找一条通路。

如果不会栈或者队列,那么就用回溯法递归解决。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式