如何用C语言编写一个迷宫程序?

如何用C语言编写一个迷宫程序?,第1张

#include \x0d\x0a#include \x0d\x0a#define M 15 \x0d\x0a#define N 15 \x0d\x0astruct mark //定义迷宫内点的坐标类型 \x0d\x0a{ \x0d\x0aint x\x0d\x0aint y\x0d\x0a}\x0d\x0a\x0d\x0astruct Element //"恋"栈元素,嘿嘿。。 \x0d\x0a{ \x0d\x0aint x,y//x行,y列 \x0d\x0aint d//d下一步的方向 \x0d\x0a}\x0d\x0a\x0d\x0atypedef struct LStack //链栈 \x0d\x0a{ \x0d\x0aElement elem\x0d\x0astruct LStack *next\x0d\x0a}*PLStack\x0d\x0a\x0d\x0a/*************栈函数****************/ \x0d\x0a\x0d\x0aint InitStack(PLStack &S)//构造空栈 \x0d\x0a{ \x0d\x0aS=NULL\x0d\x0areturn 1\x0d\x0a} \x0d\x0a\x0d\x0aint StackEmpty(PLStack S)//判断栈是否为空 \x0d\x0a{ \x0d\x0aif(S==NULL) \x0d\x0areturn 1\x0d\x0aelse \x0d\x0areturn 0\x0d\x0a} \x0d\x0a\x0d\x0aint Push(PLStack &S, Element e)//压入新数据元素 \x0d\x0a{ \x0d\x0aPLStack p\x0d\x0ap=(PLStack)malloc(sizeof(LStack))\x0d\x0ap->elem=e\x0d\x0ap->next=S\x0d\x0aS=p\x0d\x0areturn 1\x0d\x0a} \x0d\x0a\x0d\x0aint Pop(PLStack &S,Element &e) //栈顶元素出栈 \x0d\x0a{ \x0d\x0aPLStack p\x0d\x0aif(!StackEmpty(S)) \x0d\x0a{ \x0d\x0ae=S->elem\x0d\x0ap=S\x0d\x0aS=S->next\x0d\x0afree(p)\x0d\x0areturn 1\x0d\x0a} \x0d\x0aelse \x0d\x0areturn 0\x0d\x0a} \x0d\x0a\x0d\x0a/***************求迷宫路径函数***********************/ \x0d\x0avoid MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2]) \x0d\x0a{ \x0d\x0aint i,j,dint a,b\x0d\x0aElement elem,e\x0d\x0aPLStack S1, S2\x0d\x0aInitStack(S1)\x0d\x0aInitStack(S2)\x0d\x0amaze[start.x][start.y]=2//入口点作上标记 \x0d\x0aelem.x=start.x\x0d\x0aelem.y=start.y\x0d\x0aelem.d=-1//开始为-1 \x0d\x0aPush(S1,elem)\x0d\x0awhile(!StackEmpty(S1)) //栈不为空 有路径可走 \x0d\x0a{ \x0d\x0aPop(S1,elem)\x0d\x0ai=elem.x\x0d\x0aj=elem.y\x0d\x0ad=elem.d+1//下一个方向 \x0d\x0awhile(d(%d,%d,%d)",e.x,e.y,e.d)\x0d\x0a} \x0d\x0areturn//跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return还是不错滴\x0d\x0a} \x0d\x0aif(maze[a][b]==0) //找到可以前进的非出口的点 \x0d\x0a{ \x0d\x0amaze[a][b]=2//标记走过此点 \x0d\x0aelem.x=i\x0d\x0aelem.y=j\x0d\x0aelem.d=d\x0d\x0aPush(S1,elem)//当前位置入栈 \x0d\x0ai=a//下一点转化为当前点 \x0d\x0aj=b\x0d\x0ad=-1\x0d\x0a} \x0d\x0ad++\x0d\x0a} \x0d\x0a} \x0d\x0aprintf("没有找到可以走出此迷宫的路径\n")\x0d\x0a} \x0d\x0a\x0d\x0a/*************建立迷宫*******************/ \x0d\x0avoid initmaze(int maze[M][N]) \x0d\x0a{ \x0d\x0aint i,j\x0d\x0aint m,n//迷宫行,列 [/M] \x0d\x0a\x0d\x0aprintf("请输入迷宫的行数 m=")\x0d\x0ascanf("%d",&m)\x0d\x0aprintf("请输入迷宫的列数 n=")\x0d\x0ascanf("%d",&n)\x0d\x0aprintf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n)\x0d\x0afor(i=1i 回答于 2022-11-16

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

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了。

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


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

原文地址:https://54852.com/yw/11522511.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存