#include〈stdlib.h>#define STACK_INI_SIZE 100 #define STACKINCREMENT 50 #define NULL 0 typedef struct {
int *top; int *base; int length; int stacksize; }sqstack;
int mg[25][25]; int m=1,n=1,x,y;
/*********************************************/ main() {
void initstack(sqstack *s);/*初始化栈*/ void stackpush(sqstack *s,int);/*增加栈顶*/ void stackpop(sqstack *s);/*撤销栈顶*/ void stackinput(sqstack *s);/*输出栈*/ int mgway(sqstack *s);/*迷宫路径*/
void destorystack(sqstack *s);/*撤销栈S*/ void makemg(sqstack *s);/*制造迷宫*/ sqstack s;
int i,flag1=1,flag2=1,flag3=1; char ch;
srand((unsigned)time(NULL)); while(flag1) {
initstack(&s); flag2=1; makemg(&s); i=mgway(&s); if(i==0)
printf(”此迷宫没有通路\\n\"); else
stackinput(&s); destorystack(&s); printf(\"还继续么?”); fflush(stdin); scanf(”%c”,&ch); while(flag2)
{
if(ch=='n’||ch=='N') {
flag1=0;
flag2=0; }
else if(ch==’y’||ch==’Y’) {
flag1=1; flag2=0; } else {
printf(”输入错误请重新输入\"); fflush(stdin);
scanf(”%c\",&ch); } } } }
/*********************************************/ void initstack(sqstack *s)/*初始化栈*/ {
s—>top=s—〉base=(int *)malloc(STACK_INI_SIZE*sizeof(int)); if(!s->base) exit(1);
s—>stacksize=STACK_INI_SIZE; *(s->base)=0; s->top++;
*(s->top)=101; s-〉top++; s-〉length=2; }
/*********************************************/ void stackpush(sqstack *s,int i)/*增加栈顶*/ {
if(s->length〉=s—>stacksize) {
printf(”路过\");
s—>base=(int *)realloc(s->base,(STACK_INI_SIZE+STACKINCREMENT)*sizeof(int)); if(!s->base) exit(1);
s->top=s-〉base+s->length;
s-〉stacksize+=STACKINCREMENT; stackinput(s); }
if(s-〉length==0) {
*(s-〉base)=i; s-〉top++; s—〉length++; } else {
*(s—〉top)=i; s—〉top++; s—〉length++; } }
/*********************************************/ void stackpop(sqstack *s)/*删除栈顶*/ {
if(s—>length==0)
printf(”栈空 无法删除”); if(s—>length==1) {
s—>top--;
*(s-〉top)=*(s—>base)=NULL; s->length=0; } else {
s->top-—;
*(s—>top)=NULL; s->length——; } }
/*********************************************/ void stackinput(sqstack *s)/*迷宫栈的输出*/ {
int w,x,y,z,i=0,*p; p=s—〉base; p++;
printf(\"迷宫正确路径\\n\"); while(p!=s—〉top) {
printf(”(%d%d,%d%d)\",x=*p/1000,y=*p/100%10,z=*p%100/10,w=*p%10);
p++; i++; if(i==7) {
printf(\"\\n\"); i=0; } } }
/*********************************************/ int mgway(sqstack *s)/*迷宫路径*/ {
int gudge(sqstack *s,int);/*判断是否能通行*/ int homing(sqstack *s);/*退栈后I所对应的方向*/ int i=1,j,k;
while(s—〉top!=s—〉base) {
if(i<5)
j=gudge(s,i); if(j==1&&i<5) {
k=m*100+n;
stackpush(s,k); if(m==y-2&&n==x-2) {
return(1); } else i=1; } else {
if(m==0&&n==0) return(0);
else if(i==4||i==5) {
i=homing(s); stackpop(s); i++; } else i++; }
}
return(0); }
/*********************************************/ int gudge(sqstack *s,int i)/*退栈后i所对应的方向*/ {
int echo(sqstack *s); if(i==1) n++; if(i==2) m++; if(i==3) n-—;
if(i==4) m-—; if((mg[m][n]==0||mg[m][n]==2)&&echo(s)) return(1); else {
if(i==1) n——; if(i==2) m--;
if(i==3) n++; if(i==4) m++; return(0); } }
/*********************************************/ int echo(sqstack *s) {
int i,*p,*q; i=m*100+n;
p=s—〉top; q=s—〉base; q++; p——;
while(p!=q&&*p!=i) p-—; if(*p==i)
return(0); else
return(1); }
/*********************************************/ int homing(sqstack *s)/*i退位后所对应的方向*/ {
int a,b,c,d,*q; q=s—〉top; q——;
a=(*q)/100; b=(*q)%100; q-—;
c=(*q)/100; d=(*q)%100; m=(*q)/100; n=(*q)%100; if(a==c) {
if(d-b==1) return(3); else if(d—b==—1) return(1); }
else if(b==d) {
if(c—a==1) return(4); else if(c-a==-1) return(2); }
return(0); }
void destorystack(sqstack *s) {
if(*(s—〉base)!=NULL) free(s->base);
s—〉length=0; }
/*********************************************/ void makemg(sqstack *s)/*创建迷宫及输出迷宫图的函数*/ {
int mgway(sqstack *s); void clearstack(sqstack *s); int flag=1,flag2=1,i,j,k; char ch;
while(flag)
{
printf(\"请输入迷宫的长宽(长度范围2-15,宽范围2—15)\\n”); printf(”输入长\"); fflush(stdin);
scanf(\"%d\",&y); printf(\"输入宽”); fflush(stdin); scanf(”%d\",&x);
if(x〈16&&x>3&&y>3&&y<16) flag=0; if(flag==0)
printf(”自动筛选能通过的迷宫需要一段时间,请耐心等待,如20秒后无法显示出迷宫样本请重试..。 。.。\\n”); }
flag=1;
while(flag2) {
m=1; n=1;
for(i=0;i〈x;i++) for(j=0;jmg[i][j]=rand()%3; i=0;for(j=0;j〈y;j++) {
mg[i][j]=1; mg[j][i]=1; }
i=y—1;
for(j=0;jfor(j=0;jmg[x—2][y—2]=0; k=mgway(s); if(k==1) flag2=0; elseclearstack(s); }
printf(\" ”);
for(i=0;i〈y;i++) printf(”%2d”,i); printf(”\\n \"); for(i=0;iprintf(\"%2d→\); for(j=0;j〈y;j++) {if(mg[i][j]==2) printf(\"0 ”); else
printf(\"%d \",mg[i][j]); }
printf(\"\\n”); } }
/*********************************************/ void clearstack(sqstack *s)/*清空栈对于此程序而言*/ {
s—>top=s->base; *(s—〉base)=0; s—>top++;
*(s—>top)=101; s—>top++; s-〉length=2; }