迷宫程序源代码

  • 格式:doc
  • 大小:35.50 KB
  • 文档页数:4

#include"stdio.h"

#include"stdlib.h"

#define M1 11

#define N1 11 /*M1*N1为加上围墙后的迷宫大小*/

#define MAX 100 /*定义栈的最大长度*/

int M=M1-2;

int N=N1-2; /*M*N为原迷宫大小*/

typedef struct /*定义栈元素的类型*/

{

int x,y,dir;

}elemtype;

typedef struct /*定义顺序栈*/

{

elemtype stack[MAX];

int top;

}P;

struct moved /*定义方向位移数组的类型*/

{

int dx;

int dy;

};

void Newmg(int mg[M1][N1]) /*迷宫的初始化*/

{

int i,j,num;

printf("迷宫:\n");

for (i=1;i<=M;i++)

{

for (j=1;j<=N;j++)

{

num=(800*(i+j)+1500)%327; /*根据N和M值伪随机产生迷宫*/

if((num<150)&&(i!=M||j!=N))

mg[i][j]=1;

else

mg[i][j]=0;

printf("%3d",mg[i][j]);} /*输出迷宫*/

printf("\n");

}

printf("\n");

for(i=0;i<=M+1;i++) /*设置迷宫的围墙*/

{

mg[i][0]=1;

mg[i][N+1]=1;

}

for(j=0;j<=N+1;j++) {

mg[0][j]=1;

mg[N+1][j]=1;

}

}

void Newmove(struct moved move[8]) /*定义存储坐标变量的方向位移*/

{

move[0].dx=0;move[0].dy=1; /*寻找方向依次为:东,东南,南,

move[1].dx=1;move[1].dy=1; 西南,西,西北,北,东北*/

move[2].dx=1;move[2].dy=0;

move[3].dx=1;move[3].dy=-1;

move[4].dx=0;move[4].dy=-1;

move[5].dx=-1;move[5].dy=-1;

move[6].dx=-1;move[6].dy=0;

move[7].dx=-1;move[7].dy=1;

}

void Newstack(P *s) /*初始化栈*/

{

s->top=-1;

}

int RuZhan(P *s ,elemtype x) /*将数据元素x压入指针s所指的栈中*/

{

if (s->top==MAX-1)

return (0); /*如栈满,即压栈失败,则返回0*/

else

{

s->stack[++s->top]=x;

return(1); /*压栈成功,则返回1*/

}

}

elemtype ChuZhan(P *s) /*栈顶元素出栈*/

{

elemtype elem;

if (s->top<0) /*如果栈空,返回空值*/

{

elem.x=NULL;

elem.y=NULL;

elem.dir=NULL;

return(elem);

}

else {

s->top--;

return(s->stack[s->top+1]); /*如果栈非空,返回栈顶元素*/

}

}

void Search(int mg[M1][N1],struct moved move[8],P *s)

{ /*寻找迷宫的通路*/

int i,j,dir,x,y,k;

elemtype elem;

i=1;j=1;dir=0;

mg[1][1]=-1; /*设置(1,1)为入口处*/

do

{

x=i+move[dir].dx; /*寻找下一步可行的到达点的坐标*/

y=j+move[dir].dy;

if(mg[x][y]==0)

{

elem.x=i;elem.y=j;elem.dir=dir;

k=RuZhan(s,elem); /*如果可通过,将此点数据压栈*/

if(k==0)

printf("栈长度太短\n"); /*如果入栈操作返回0,说明栈容量不够*/

i=x;j=y;dir=0;mg[x][y]=-1;

}

else if(dir<7)

dir++;

else /*如果八个方向都不可行,就退回一步*/

{

elem=ChuZhan(s);

if (elem.x!=NULL)

{

i=elem.x;

j=elem.y;

dir=elem.dir+1;

}

}

}while (!((s->top==-1)&&(dir>=7)||(x==M)&&(y==N)));

/*循环,直到入口处或出口处为止*/

if(s->top==-1) /*如果最终是入口处,则迷宫无通路*/

printf("此迷宫无通路\n");

else

{

elem.x=x;elem.y=y;elem.dir=dir;

k=RuZhan(s,elem); /*将最后出口的坐标压入栈中*/

printf("迷宫通路:\n"); printf (" 入口->");

i=0;

while (i<=s->top)

{

printf("(%d,%d)->",s->stack[i].x,s->stack[i].y); /*显示迷宫通路*/

if(i!=s->top)

if((i+1)%4==0)

printf("\n");

i++;

}

printf ("出口\n");

}

}

void main() /*寻找迷宫通路程序*/

{

P *s;

int mg[M1][N1];

struct moved move[8];

Newmg (mg); /*调用函数初始化迷宫*/

s=(P*)malloc(sizeof(P));

Newstack(s); /*调用函数初始化栈*/

Newmove(move); /*调用函数初始化位移数组*/

Search (mg,move,s); /*调用函数寻找迷宫通路*/

}