| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 569 人关注过本帖
标题:[求助]给我修改一下我的这个迷宫的程序
取消只看楼主 加入收藏
文子
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-6-6
收藏
 问题点数:0 回复次数:0 
[求助]给我修改一下我的这个迷宫的程序

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
/*数据结构定义迷宫坐标*/
typedef struct
{
int x;/*行值*/
int y;/*列值*/
}PosType;/*迷宫坐标位置类型 */


#define MAXLENGTH 25/*设迷宫的最大行列为25*/
typedef int MazeType[MAXLENGTH][MAXLENGTH];/*迷宫数组[行][列]*/
/*全局变量 */
typedef int MazePath;
MazeType m;/*迷宫数组 */
int curstep=1;/*当前足迹,初值为1*/

typedef struct
{
int ord;/*通道块在路径上的“序号”*/
PosType seat;/*通道块在迷宫中的“坐标位置”*/
int di;/*从此通道块走向下一通道块的“方向”(0,1,2,3分别表示东,南,西,北)*/
}SElemType;/*栈的元素类型*/

typedef struct /*定义运行栈*/
{
SElemType *base;
SElemType *top;
int StackSize;
}SqStack;

/*顺序栈的基本操作函数*/
Status InitStack(SqStack *S) /*构造运行栈*/
{if(!(S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
exit(OVERFLOW);
S->top=S->base;
S->StackSize=STACK_INIT_SIZE;
return OK;}

Status DestroyStack(SqStack *S)
{free (S->base);
S->base=NULL;
S->top=NULL;
S->StackSize=0;
return OK;
}

Status ClearStack(SqStack *S)
{S->top=S->base;
return OK;
}

Status StackEmpty(SqStack S)
{if (S.top==S.base)
return TRUE;
else
return FALSE;
}

int StackLenth(SqStack S)
{
return(S.top-S.base);
}

Status Push(SqStack *S,SElemType e) /*把*e压入栈s,栈定指针加1*/
{if (S->top-S->base>=S->StackSize)
{S->base=(SElemType *)realloc(S->base,(S->StackSize+STACKINCREMENT)*sizeof(SElemType));
if (!S->base)
exit(OVERFLOW);
S->top=S->base+S->StackSize;
S->StackSize+=STACKINCREMENT;
}
*(S->top)++=e;
return OK;
}

Status Pop(SqStack *S,SElemType *e) /*栈顶元素*e出栈*/
{ if(S->top==S->base)
return ERROR;
*e=--S->top;
return OK;
}

Status StackTraverse(SqStack S,Status(*visit)(SElemType))
{while (S.top>S.base)
visit(*S.base++);
printf("\n");
return OK;}


/*定义墙元素值为1,可通过路径为1,不可通过路径为-1,通过路径为足迹 */
Status Pass(PosType b)
{/*当迷宫m的b点的序号为(可通过路径),return OK;否则,return ERROR */
if(m[b.x][b.y]==1) return OK;
else return ERROR;
}

void FootPrint(PosType a) /*走过的路经留下足迹,也就是将坐标值为非零*/
{/*使迷宫m的a点的序号变为足迹(curstep)*/
m[a.x][a.y]=curstep;
}

PosType NextPos(PosType c,int di) /*规定下一步试探的方向*/
{/*根据当前位置及移动方向,返回下一位置 */
PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}};/*{行增量,列增量}*/
/*移动方向,依次为东南西北*/
c.x+=direc[di].x;
c.y+=direc[di].y;
return c;
}

void MarkPrint(PosType b)
{/*使迷宫m的b点的序号变为-1(不能通过的路径)*/
m[b.x][b.y]=-1;
}

Status MazePath(PosType start,PosType end)
{/*若迷宫maze中存放在从入口start到出口end的通道,则求得一条*/
/*存放在栈中(从栈底到中栈顶),并返回TRUE;否则返回FALSE*/
SqStack S;
PosType curpos;
InitStack(S);
curpos=start;
do
{
if(Pass(curpos))
{/*当前位置可以通过,即是未曾走到过的通道块*/
FootPrint(curpos);/*留下足迹*/
e.ord=curstep;
e.seat.x=curpos.x;
e.seat.y=curpos.y;
e.di=0;
Push(S,e);/*入栈当前位置及状态*/
curstep++;/*足迹加1*/
if(curpos.x==end.x&&curpos.y==end.y)/*到达终点(出口)*/
return TRUE;
curpos=NextPos(curpos,e.di);
}
else
{/*当前位置不能通过*/
if(!StackEmpty(S))
{Pos(S,e);/*退栈到前一位置 */
curstep--;
while(e.di==3&&!StackEmpty(S))/*前一位置处于最后一个方向(北)*/
{ MarkPrint(e.seat);/*留下不能通过的标记(-1)*/
Pos(S,e);/*退回一步*/
curstep--;
}
if(e.di<3)/*没到最后一个方向(北)*/
{e.di++;/*换下一个方向探索*/
Push(S,e);
curstep++;
curpos=NextPos(e.seat,e.di);/*设定当前位置是该新方向上的相邻块*/
}
}
}
}while(!StackEmpty(S));
return FALSE;
}

void Print(int x,int y)
{/*输出迷宫的解*/
int i,j;
for(i=0;i<x;i++)
{for(j=0;j<y;j++)
printf("%3d",m[i][j]);
printf("\n");
}
}

void main()
{PosType begin,end;
int i,j,x,y,x1,y1;
printf("请输入迷宫的行数,列数(包括外墙):");
scanf("%d,%d",&x,&y);
for(i=0;i<x;i++)/*定义周边值为0(同墙)*/
{m[0][i]=0;/*行周边*/
m[x-1][i]=0;
}
for(j=1;j<y-1;j++)
{m[j][0]=0;/*列周边*/
m[j][y-1]=0;
}
for(i=1;i<x-1;i++)
for(j=1;j<y-1;j++)
m[i][j]=1;/*定义通道初值为1*/
printf("请输入迷宫内墙单元数: ");
scanf("%d",&j);
printf("请依次输入迷宫内墙每个单元的行数,列数: \n");
for(i=1;i<=j;i++)
{scanf("%d,%d",&x1,&y1);
m[x1][y1]=0;/*定义墙的值为0 */
}
printf("迷宫结构如下: \n");
Print(x,y);
printf("请输入起点的行数,列数: ");
scanf("%d,%d",&end.x,&end.y);
if(MazePath(begin,end))/*求得一条通路*/
{printf("此迷宫从入口到出口的一条路径如下: \n");
Print(x,y);/*输出此通路*/
}
else
printf("此迷宫没有从出口到入口的路径: \n");
}


哪位高手啊,给我改改这个程序吧!!!!!

搜索更多相关主题的帖子: 迷宫 
2006-06-06 20:17
快速回复:[求助]给我修改一下我的这个迷宫的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030832 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved