中易网

走迷宫的C语言版代码?求助 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮

答案:2  悬赏:50  
解决时间 2021-02-09 23:14
走迷宫的C语言版代码?求助 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮
最佳答案

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define stack_init_size 200
#define stack_increment 10
#define OVERFLOW 0
#define OK 1
#define ERROE 0
#define TRUE 1
#define FALSE 0
typedef int Status;

typedef struct{
int x;
int y;
}PosType;

typedef struct {
int ord; // 通道块在路径上的"序号"
PosType seat; //通道块在迷宫中的"坐标位置"
int di; //从此通道块走向下一通道块的"方向"
}SElemType;

typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;

int mg[20][20];


void Random(){
int i,j,k;
srand(time(NULL));
mg[1][0]=mg[1][1]=mg[18][19]=0; //将入口、出口设置为"0"即可通过
for(j=0;j<20;j++)
mg[0][j]=mg[19][j]=1;
for(i=2;i<19;i++)
mg[i][0]=mg[i-1][19]=1;
for(i=1;i<19;i++)
for(j=1;j<19;j++){
k=rand()%3; //随机生成0、1、2三个数
if(k)
mg[i][j]=0;
else{
if((i==1&&j==1)||(i==18&&j==18))
mg[i][j]=0;
else
mg[i][j]=1;
}
}
}
//构造一个空栈
Status InitStack(SqStack &s){
s.base =(SElemType *)malloc(stack_init_size * sizeof(SElemType));
if(!s.base) return OVERFLOW;
s.top=s.base;
s.stacksize=stack_init_size;
return OK;
}

//当前块可否通过
Status Pass(PosType e){
if (mg[e.x][e.y]==0) //0时可以通过
return OK; // 如果当前位置是可以通过,返回1
return OVERFLOW; // 其它情况返回0
}

//留下通过的足迹
Status FootPrint(PosType e){
mg[e.x][e.y]=7;
return OK;
}

//压入栈
Status Push(SqStack &s,SElemType e){
if(s.top-s.base>=s.stacksize){
s.base=(SElemType *)realloc(s.base,(s.stacksize+stack_increment) *sizeof(SElemType));
if(!s.base)exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stack_increment;
}
*s.top++=e;
return OK;
}

//出栈
Status Pop(SqStack &s,SElemType &e){
if(s.top==s.base)
return ERROE;
e=*--s.top;
return OK;
}

//下一步
PosType NextPos(PosType &e,int dir){
PosType E;
switch(dir){
case 1:E.x=e.x; //向下
E.y=e.y+1;
break;
case 2:E.x=e.x+1; //向右
E.y=e.y;
break;
case 3:E.x=e.x; //向上
E.y=e.y-1;
break;
case 4:E.x=e.x-1; //向左
E.y=e.y;
break;
}
return E;
}

//是否空栈
Status StackEmpty(SqStack s){
if (s.top==s.base)
return OK;
return OVERFLOW;
}

//留下不能通过的足迹
Status MarkPrint(PosType e){
mg[e.x][e.y]=3;
return OK;
}

//迷宫函数
// 若迷宫maze中从入口 start到出口 end的通道,则求得一条存放在栈中
// (从栈底到栈顶),并返回TRUE;否则返回FALSE
Status MazePath(int mg,PosType start,PosType end,SqStack &s){
PosType curpos;
InitStack(s);
SElemType e;
int curstep;
curpos=start; // 设定"当前位置"为"入口位置"
curstep=1; // 探索第一步
do{
if(Pass(curpos)){ // 当前位置可通过,即是未曾走到过的通道块
FootPrint(curpos); // 留下足迹
e.di =1;
e.ord = curstep;
e.seat= curpos;
Push(s,e); // 加入路径
if(curpos.x==end.x&&curpos.y==end.y){
printf("\n\n0∩_∩0 能到达终点!");
return TRUE;
}
curpos=NextPos(curpos,1); // 下一位置是当前位置的东邻
curstep++; // 探索下一步
}
else{ // 当前位置不能通过
if(!StackEmpty(s)){
Pop(s,e);
while(e.di==4&&!StackEmpty(s)){
MarkPrint(e.seat);
Pop(s,e);
}
if(e.di<4){
e.di++;
Push(s,e); // 留下不能通过的标记,并退回一步
curpos=NextPos(e.seat,e.di);
}//if
}//if
}//else
}while(!StackEmpty(s));
printf("\n\n囧 ! 不能到达终点!");
return FALSE;
}

//打印迷宫
void PrintMaze(){
int i,j;
printf("运行路径:\n\n");
for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(mg[i][j]==0)printf(" ");
else if(mg[i][j]==1) printf("■"); //迷宫的"墙"
else if(mg[i][j]==3) printf("◇"); //不通的路
else if(mg[i][j]==7)printf("○"); //通过的路径
}
printf("\n");
}
printf("\n");
}

void main(){
SqStack S;
PosType start,end;
start.x=1;start.y=0; //起点坐标
end.x=18;end.y=19; //终点坐标
printf("\n==================迷宫游戏==================");
printf("\n说明:■不能走的区域\t◇走不通的区域");
printf("\n '空格'代表未到过的区域");
printf("\n ○代表能通过的路径,指向终点");
printf("\n============================================");
Random();
printf("\n\nTest 1:");
MazePath(mg[20][20],start,end,S);
PrintMaze();
system("pause");
Random();
printf("\nTest 2:");
MazePath(mg[20][20],start,end,S);
PrintMaze();
system("pause");
Random();
printf("\nTest 3:");
MazePath(mg[20][20],start,end,S);
PrintMaze();
printf("\n==========程序退出,感谢使用!==========\n");
}
全部回答
每走过一个点,要把走过的点的坐标由0改成其他值,如2,这样就不会在朝回走,造成循环了,嘿嘿,我写的如下: #include #include #define m 15 #define n 15 struct mark //定义迷宫内点的坐标类型 { int x; int y; }; struct element //"恋"栈元素,嘿嘿。。 { int x,y; //x行,y列 int d; //d下一步的方向 }; typedef struct lstack //链栈 { element elem; struct lstack *next; }*plstack; int initstack(plstack &s)//构造空栈 { s=null; return 1; } int stackempty(plstack s)//判断栈是否为空 { if(s==null) return 1; else return 0; } int push(plstack &s, element e)//压入新数据元素 { plstack p; p=(plstack)malloc(sizeof(lstack)); p->elem=e; p->next=s; s=p; return 1; } int pop(plstack &s,element &e) //栈顶元素出栈 { plstack p; if(!stackempty(s)) { e=s->elem; p=s; s=s->next; free(p); return 1; } else return 0; } void mazepath(struct mark start,struct mark end,int maze[m][n],int diradd[4][2]) { int i,j,d;int a,b; element elem,e; plstack s1, s2; initstack(s1); initstack(s2); maze[start.x][start.y]=2; //入口点作上标记 elem.x=start.x; elem.y=start.y; elem.d=-1; //开始为-1 push(s1,elem); while(!stackempty(s1)) //栈不为空 有路径可走 { pop(s1,elem); i=elem.x; j=elem.y; d=elem.d+1; //下一个方向 while(d<4) //试探东南西北各个方向 { a=i+diradd[d][0]; b=j+diradd[d][1]; if(a==end.x && b==end.y && maze[a][b]==0) //如果到了出口 { elem.x=i; elem.y=j; elem.d=d; push(s1,elem); elem.x=a; elem.y=b; elem.d=886; //方向输出为-1 判断是否到了出口 push(s1,elem); printf("\n0=东 1=南 2=西 3=北 886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n"); while(s1) //逆置序列 并输出迷宫路径序列 { pop(s1,e); push(s2,e); } while(s2) { pop(s2,e); printf("-->(%d,%d,%d)",e.x,e.y,e.d); } return; //跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return还是不错滴o(∩_∩)o... } if(maze[a][b]==0) //找到可以前进的非出口的点 { maze[a][b]=2; //标记走过此点 elem.x=i; elem.y=j; elem.d=d; push(s1,elem); //当前位置入栈 i=a; //下一点转化为当前点 j=b; d=-1; } d++; } } printf("没有找到可以走出此迷宫的路径\n"); } void initmaze(int maze[m][n]) { int i,j; int m,n; //迷宫行,列 printf("请输入迷宫的行数 m="); scanf("%d",&m); printf("请输入迷宫的列数 n="); scanf("%d",&n); printf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n); for(i=1;i<=m;i++) for(j=1;j<=n;j++) scanf("%d",&maze[i][j]); printf("你建立的迷宫为o(∩_∩)o...\n"); for(i=0;i<=m+1;i++) //加一圈围墙 { maze[i][0]=1; maze[i][n+1]=1; } for(j=0;j<=n+1;j++) { maze[0][j]=1; maze[m+1][j]=1; } for(i=0;i<=m+1;i++) //输出迷宫 { for(j=0;j<=n+1;j++) printf("%d ",maze[i][j]); printf("\n"); } } void main() { int sto[m][n]; struct mark start,end; //start,end入口和出口的坐标 int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量 方向依次为东西南北 initmaze(sto);//建立迷宫 printf("输入入口的横坐标,纵坐标[逗号隔开]\n"); scanf("%d,%d",&start.x,&start.y); printf("输入出口的横坐标,纵坐标[逗号隔开]\n"); scanf("%d,%d",&end.x,&end.y); mazepath(start,end,sto,add); //find path system("pause"); }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
做饭用甲醇便宜还是煤气便宜。
QQ情侣空间解除以后再恢复,那里边的的家园园
黄河博物馆要门票吗?
废旧塑料轮胎能提炼出来成品油吗?质量如何!
跟相亲男见面,他工作条件都不错,个头高,就
科目三掉头的时候,如果前面有车,我们临时停车
河南淮滨县有卖安利的吗
从广州市东圃车站到中山城东车站要多久?多少
祥云雨藏酒轩地址有知道的么?有点事想过去
长安cx70能够用u盘播放视频吗?
《离婚律师》上倒立哪个是什么设备啊?
大拇指我想知道这个在什么地方
赛尔号怎样改变天赋
全新英朗底盘下怎会有一根细线露出来
歌词中有爱情这条路 甜蜜什么的 一个女生唱的
推荐资讯
刀剑神域3大概什么时间会出?还有就是想问一
求购二手碰碰车
德信火锅·干锅地址在哪,我要去那里办事
通威饲料地址在哪,我要去那里办事
掌上观文打一动物
文科生应该看哪些课外书对文综有帮助?有具体
中国邮政储蓄银行涪洋营业所地址有知道的么?
拿过期的临时身份证去取银行取钱行吗
翻译英语文章然后拿去投稿,得到的稿费都是自
青铜修炼手册第六期提莫那的bgm谁知道
在做仓库管理,怎样才能干好啊?
2012江西省九江市彭泽县的中考分数怎么算啊?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?