[CC++]最近在写一个程序,求解迷宫通路.但是调试的过程中出现了一些问题,问题如下.

[CC++]最近在写一个程序,求解迷宫通路.但是调试的过程中出现了一些问题,问题如下.,第1张

按照你的代码,我调试并没有问题

我看很可能问题出在NextPos

我看你函数喜欢用传值,如果NextPos参数也是用传值的方法,那么你在NextPos中改变结构成员值,对主函数判断不起任何作用。

建议结构用指针参数传址,传值形参本身就要开辟和原结构一样大的内存空间,本身还浪费资源

#include<stdioh>

typedef struct {

int r, c;  //迷宫中r行c列的位置

}PosType;

_Bool Same(PosType pos1, PosType pos2)

{

    if ((pos1r == pos2r) && (pos1c == pos2c))

    {

        return 1;

    }

    else

        return 0;

}

int main()

{

    _Bool Same(PosType pos1, PosType pos2);

    PosType pos1, pos2;

    pos1c=10;

    pos1r=20;

    pos2c=10;

    pos2r=20;

    printf("Same(pos1,pos2)返回值为 %d",Same(pos1,pos2));

    return 0;

}

输入这段就不用写了吧。比较简单

A 输入迷宫

用2维数组把这个 迷宫存下来就行了。 墙用0表示 路用1表示。 或者直接用字符的2维数组也行。设为公共变量 migong[m][m] 用公共变量存 m

B 走通判定 (这里以一个迷宫为例,多个迷宫的话 输入那边处理一下就好了,反正中心思想就是1个迷宫用一个2维数组存)

是否能走通的判定。 用迭代法

1 判定周围是否有e(因为e在右下角 只用判断下方和右方就可以了)

2 没有向右走

3 右是墙的话向下走

4 下是墙的话向左走

5 左是墙的话向上走。

bool findway(int startx,int,starty)

{

int end = m - 1;

if(x + 1 == end && y == end || x == end && y + 1 == end )

{

return true; //可以走通 返回YES

}

else if (x + 1 < end && migong[x + 1][y] != '#') //当前点不处于最右侧 且右侧点不为墙的时候

{

findway(startx + 1,starty); //右移

}

else if(y + 1 < end && migong[x][y+1] !='#' ) //当前点不处于最下侧 且下侧点不为墙的时候

{

findway(startx,starty + 1); //下移

}

//按照这个思路做 以下省略

}

然后主函数中调用 findway(0,0) 就OK了。

写得比较简单,不好意思。

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

我这里假设迷宫某个边界位置是起点,(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;

}

注意:

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

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

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

有不明白的地方请追问。

以上就是关于[C/C++]最近在写一个程序,求解迷宫通路.但是调试的过程中出现了一些问题,问题如下.全部的内容,包括:[C/C++]最近在写一个程序,求解迷宫通路.但是调试的过程中出现了一些问题,问题如下.、C语言:迷宫,求程序,快哭了!好虐。。。、关于C++迷宫问题,寻找一条通路穿越迷宫(找到一条即可)。要求写出一个递归程序来穿越迷宫。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10088173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存