迷宫问题c语言vc6.0,急!!!,帮忙改一下这个C语言程序,迷宫问题。用VC++6.0...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#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);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值