一个超弱智的c语言迷宫问题

ailsa1993 2012-12-02 10:58:13
没有bug但是就是算不出答案啊。。。。跪求大神解答!






// 迷宫问题.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define OVERFLOW -2
#define STACK_INIT_SIZE 5
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define WALL -1
#define N 6 //迷宫大小为4*4


typedef struct
{
int x,y;
} PosType;// 坐标

typedef struct
{
//int ord;//路径上序号
PosType seat;//坐标
int di;//方向
}StackNode ;//*************栈元素

typedef struct Stack
{
StackNode *base;
StackNode *top;
int stacksize;
}Stack;//*******************栈S用来放路径

typedef char MazeType [N][N];//标识每个位置是否可通过 N-1*N-1的迷宫
typedef int Status;

void initial(MazeType &maze);//用于初始化迷宫的函数
Status Check(PosType loc);//判断当前位置可否通过
Status InitStack(Stack &S);
Status Push(Stack &S, StackNode p) ;
Status Pop(Stack &S, StackNode &p);
Status StackEmpty(Stack S) ;//栈空返1

MazeType maze;//全局变量 迷宫



Status InitStack(Stack &S) //建栈
{
S.base = (StackNode *)malloc(STACK_INIT_SIZE * sizeof(StackNode));
if(!S.base) exit(OVERFLOW);
S.stacksize = STACK_INIT_SIZE;
S.top = S.base;
return OK;
}//InitStack

Status Push(Stack &S, StackNode p) //入栈
{
if(S.top - S.base >= S.stacksize ) return OVERFLOW;
*S.top++ = p;
return OK;
}//push

Status Pop(Stack &S, StackNode &p) //出栈
{
if(S.top == S.base ) return ERROR;
p = *(--S.top);
return OK;
}//pop

Status StackEmpty(Stack S) //判断栈空
{ if(S.top == S.base ) return TRUE;
else return FALSE;
}



void main()
{
Stack S;
InitStack(S);
PosType loc;
StackNode p; //用于记录路径的栈元素
StackNode d[4]; //四个方向
initial (maze); //初始化迷宫
printf("\n%c",maze[2][1]);
printf("\n%c\n",maze[1][1]);
loc.x=1;
loc.y=1; //当前位置置为入口位置
do{
if(Check(loc)==OK)
{
p.di=3;
p.seat.x=loc.x;
p.seat.y=loc.y;
maze[loc.x][loc.y]='@';//此处已走过
Push(S,p);
if((loc.x==N-2)&&(loc.y==N-2))
break;
else loc.y++;
}
else{
if(!StackEmpty(S))//若当前位置不可通过且栈不为空
{
Pop(S,p);
d[0].seat.x=p.seat.x-1;d[0].seat.y=p.seat.y;
d[1].seat.x=p.seat.x;d[1].seat.y=p.seat.y-1;
d[2].seat.x=p.seat.x+1;d[2].seat.y=p.seat.y;
d[3].seat.x=p.seat.x;d[3].seat.y=p.seat.y+1;
if(p.di>0)
{
loc.x=d[p.di-1].seat.x;
loc.y=d[p.di-1].seat.y;
p.di--;
Push(S,p);
}
else if(p.di==0)
{
Pop(S,p);
if(!StackEmpty(S))
{
loc.x=p.seat.x;
loc.y=p.seat.y;
}
}
}if(StackEmpty(S)) printf("我找不到出口了,你设的迷宫木有出路啊!!!");

}
}while(!StackEmpty(S));
printf("就这样屁颠屁颠地滚出这个迷宫好吗!!!>>>>>>>\n") ;
while(!StackEmpty(S))
{
Pop(S,p);
printf("(%d,%d)>",p.seat.x,p.seat.y);
}
getchar();
getchar();
}

void initial(MazeType &maze)//初始化迷宫
{
int i,j;
PosType m;
maze[0][0]='*';maze[0][N-1]='*';
maze[N-1][0]='*';maze[N-1][N-1]='*';
for(i=1;i<N-1;i++)
{
maze[i][0]='*';
maze[i][N-1]='*';
maze[0][i]='*';
maze[N-1][i]='*';//最外围是迷宫外边界*
for(j=1;j<N-1;j++)
maze[i][j]='?';//用?对迷宫初始化
}
printf("请以a,b的形式输入%d * %d 大小的迷宫中墙的坐标 以0,0结束",N-2,N-2);
scanf("%d,%d",&m.x,&m.y);


while(!(m.x==0||m.y==0))//只要不是结束标志
{

maze[m.x][m.y]='*';//墙的位置用*标出
scanf("%d,%d",&m.x,&m.y);
}
printf("\n%c",maze[1][3]);

printf("\n*******************n迷宫已建好****************\n");
}

Status Check(PosType loc)//判断当前位置可否通过>-1为墙 0为已来过
{
if(maze[loc.x][loc.y]=='*')
return WALL;
else if(maze[loc.x][loc.y]=='?')
return OK;

else if(maze[loc.x][loc.y]=='@')
return ERROR;
}
...全文
283 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
TAXUEc750 2012-12-04
  • 打赏
  • 举报
回复
尼玛,你这是小老鼠走迷宫吧
赵4老师 2012-12-04
  • 打赏
  • 举报
回复
yisikaipu 2012-12-03
  • 打赏
  • 举报
回复
建议给个数据文件好做测试

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧