该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#define M2 12 /*M2*N2为实际使用迷宫数组的大小*/#define N2 11 #define MAXLEN M2 /*栈的长度*/
#include "stdio.h"#include "malloc.h"
int M=M2-2, N=N2-2; /*M*N为迷宫的大小*/
typedef struct /*定义栈元素的类型*/{int x,y,dir;}elemtype;
typedef struct /* 定义顺序栈*/ {elemtype stack[MAXLEN];int top;int base;}sqstack;
struct moved /*定义方向位移数组的元素类型对于存储坐标增量的方向位移数组move*/{int dx,dy; };
void inimaze(int maze[][N2]) /*初始化迷宫*/{ int i,j,num;for(i=1;i<=M;i++){for(j=1;j<=N;j++){num=(800*(i+j)+1500) %327; /*根据M和N值产生迷宫*/if((num<150)&&(i!=M || j!=N))maze[i][j]=1;elsemaze[i][j]=0;printf("%3d", maze[i][j]); /*显示迷宫*/} printf("\n");}printf("\n");for(i=0,j=0;i<=M+1;i++) /*设置迷宫的边界值*/maze[i][j]=1;for(i=0,j=N+1;i<=M+1;i++)maze[i][j]=1;for(i=0,j=0;j<=N+1;j++)maze[i][j]=1;for(i=M+1,j=0;j<=N+1;j++)maze[i][j]=1;} /*inimaze*/
void inimove(struct moved move[]) /*初始化方向位移数组*/{ /* 依次为东E,东南SE,南S,西南SW,西W,西北NW,北N,东北NE*/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;}
int inistack(sqstack s) /*初始化栈*/{ s.base=(int )malloc(100*sizeof(int));if(!s.base)return 0;s.top=s.base=0;return 1;}
int push(sqstack *s,elemtype x) /*数据元素x入指针s所指的栈*/{ if(s->top==MAXLEN-1) /*栈满,返回0 */return(0); else { s->stack[++s->top]=x; /*栈不满,执行入栈操作 */return(1); }}
elemtype pop(sqstack *s) /*栈顶元素出栈*/{ elemtype elem; if (s->top==s->base) /*如果栈空,返回空值*/ {elem.x = NULL; elem.y = NULL; elem.dir = NULL; return(elem);} else{ s->top-- ;return(s->stack[s->top+1]); /*如果栈不空,返回栈顶元素值*/ }}
void path(int maze[][N2],struct moved move[],sqstack *s) /*寻找迷宫中的一条通路*/{int i, j, dir, x, y, f;elemtype elem;i=1; j=1; dir=0;maze[1][1] = -1; /*设[1][1]为入口处*/do{ x=i+move[dir].dx; /*求下一步可行的到达点的坐标*/y=j+move[dir].dy;if(maze[x][y]==0){elem.x = i; elem.y = j;elem.dir = dir;f=push(s, elem); /*如果可行,将此点数据入栈*/if(f==0) /*如果入栈操作返回假,说明栈容量不够*/printf("栈长度太短\n");i=x; j=y; dir=0; maze[x][y]= -1;}elseif(dir<7) /*如果当前方向不可行,就转到下一个方向*/dir++;else{elem = pop(s); /*8个方向都不可行,就转到下一个方向*/if(elem.x!=NULL){i=elem.x; j=elem.y; dir=elem.dir+1;}}}while(!((s->top== -1)&&(dir>=7)|| (x==M)&&(y==N)&&(maze[x][y]== -1))); /*循环,直到入口处或出口处为止*/if (s->top==-1) /*如果是入口处,则迷宫无通路*/printf("此迷宫无通路\n");else{ elem.x = x;elem.y = y; elem.dir = dir; /*将最后出口处的坐标压入栈中*/f= push(s,elem);printf("迷宫通路是:\n");i= 0;while (i<=s->top){printf("%d, %d", s->stack[i].x , s->stack[i].y ); /*显示迷宫通路*/if (i!=s->top)printf("-->");if((i+1)%4==0)printf("\n");i++;}printf("\n");}}
void draw(int maze[][N2], sqstack *s) /*在迷宫中绘制出通路*/{ int i, j;elemtype elem; for(i =1; i<=M; i++) /*将迷宫中全部的-1值恢复为0值*/for(j =1;j<=N; j++)if (maze[i][j]== -1)maze[i][j]=0;while (s->top> -1) /*根据栈中元素的坐标,将通路的各个点的值改为8*/{elem = pop(s);i = elem.x;j = elem.y;maze[i][j]=8;}for(i =1; i<=M; i++) {for(j =1;j<=N; j++)printf("%3d", maze[i][j]);printf("\n");}printf("\n");}
void main(){sqstack s;inistack(s);int maze[M2][N2];struct moved move[8]; inimaze(maze); inimove(move); path(maze, move,&s); draw(maze,&s);}