您的位置:首页 > 编程语言 > C语言/C++

用C语言实现迷宫求解问题

2009-10-24 23:19 549 查看
最近学数据结构的,看到个迷宫求解的问题,拿老师的代码来仔细专研,研究了大半天,才看出个端倪,

是采用先进后出的

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define m 8
#define n 8
struct stype
{int r,c,pre;
}sq[400];
int maze[m+2][n+2];/*define maze*/
int zx[8]={-1,-1,0,1,1,1,0,-1},zy[8]={0,1,1,1,0,-1,-1,-1};/*X,Y移动增量,八个方向*/

void printpath(int rear);

void mazepath( )
{
int i,j,x,y,v,find,rear,front;
sq[1].r=1;
sq[1].c=1;
sq[1].pre=0;
find=0;
j=0;
front=1; //从(1,1)开始搜索
rear=1;
maze[1][1]=1;//有改动
while(front<=rear&&!find)
{
x=sq[front].r;
y=sq[front].c;
for(v=0;v<8;v++) //循环扫描每个方向
{
i=zx[v]+x; //选择一个前进方向(i,j)
j=zy[v]+y;
if(maze[i][j]==0) //如果该方向可走
{
rear++; //进入队列
sq[rear].r=i;
sq[rear].c=j;
sq[rear].pre=front;
maze[i][j]=-1; //避免搜索过的位置重复搜索
}
if(i==m&&j==n) //找到了出口
{
printpath(rear);
find=1;
}
}
front++;
}
if(!find) printf("不存在路径!");
}

void printpath(int rear)/*输出路径算法*/
{
int i,j;
struct stype p[100];
i=rear;
do
{
printf("(%d,%d)",sq[i].r,sq[i].c);
i=sq[i].pre;
}while(i!=0);
}

void main()
{
int i,j;
printf("输入迷宫:");
for(i=0;i<=m+1;i++)
{
printf("第%d行:/n",i);
for(j=0;j<=n+1;j++)
scanf("%d",&maze[i][j]);
}
printf("输出迷宫:/n");
for(i=0;i<=m+1;i++)
{
for(j=0;j<=n+1;j++)
printf("%d",maze[i][j]);
printf("/n");
}
printf("路径为:");
mazepath();
getch();
}

最后找到的路径为(8,8)(7,8)(6,7)(5,6)(4,5)(3,4)(3,3)(2,2)(1,1)

从[1][1] 开始,按北,东北,东,东南,南,西南,西,西北的方向分别对[0][1],[0][2],[1][2],[2][2],[2][1],[2][0],[1][0],[0][0]

进行扫描,如果该方向可走,把该通道放入队列,并把此通道赋值为-1,可避免重复搜索,其他文字还有很多懒得再写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: