迷宫的代码 不知道还有优化的地方没有

写了一个迷宫的代码,还没有测试,你们看看有没有错误。有没有改的地方。

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

intx,y,mg[22][22]; inthang,lie;

intstx,sty,edx,edy;

voidreadyMG(inta[22][22])

{

for(hang=0;hang<=11;hang++)

{

for(lie=0;lie<=11;lie++)

{

mg[lie][hang]=1;

}

}

}

voiddrawMG(inta[22][22])

{

printf("");

for(hang=0;hang<=x+1;hang++)

{

printf("%2d",hang);

}printf("\n");

for(lie=0;lie<=y+1;lie++)

{

printf("%3d",lie);

for(hang=0;hang<=x+1;hang++)

{

if(a[lie][hang]==-1)printf("");

if(a[lie][hang]==0)printf("");

if(a[lie][hang]==1)printf("");

if(a[lie][hang]==2)printf("·");

}

printf("\n");

}

}

voidcheckright(inta[22][22])

{

for(hang=1;hang<=y;hang++)

{

for(lie=1;lie<=x;lie++)

{

for(;(mg[lie][hang]!=1)&&(mg[lie][hang]!=0);)

{

printf("坐标(%d,%d)的数据错误,请重新输入:\n",lie,hang);

scanf("%d",&mg[lie][hang]);

}

}

}

system("CLS");

printf("迷宫数据检查完毕,迷宫数据输入正确,系统自动生成迷宫,并以图形显示。\n");

}

typedefstructqnode

{

intdata[400];

structqnode*next;

}QNode;

typedefstruct

{

QNode*front;

QNode*rear;

}LiQueue;

voidInitQueue(LiQueue*&q)

{

q=(LiQueue*)malloc(sizeof(LiQueue));

q->front=q->rear=NULL;

}

voidClearQueue(LiQueue*&q)

{

QNode*p=q->front,*r;

if(p!=NULL)

{

r=p->next;

while(r!=NULL)

{

free(p);

p=r;

r=p->next;

}

}

free(q);

}

intQueueEmpty(LiQueue*q)

{

if(q->rear==NULL)

return1;

else

return0;

}

struct

{

inti,j;

intpre;

}Qu[100];

intfront=-1,rear=-1;

voidprint(intfront)

{

intk=front,j,ns=0;

printf("\n");

do

{

j=k;

k=Qu[k].pre;

Qu[j].pre=-1;

}while(k!=0);

printf("系统已搜索到最佳路径:\n");

k=0;

while(k<100)

{

if(Qu[k].pre==-1)

{

ns++;

printf("\t(%d,%d)-",Qu[k].j,Qu[k].i);

mg[(Qu[k].i)][(Qu[k].j)]=2;

if(ns%5==0)printf("\n");

}

k++;

}

printf("完毕\n");

}

intmgpath(intxi,intyi,intxe,intye)

{

inti,j,find=0,di;

rear++;

Qu[rear].i=xi;Qu[rear].j=yi;

Qu[rear].pre=-1;

mg[1][1]=-1;

while(front<=rear&&!find)

{

front++;

i=Qu[front].i;j=Qu[front].j;

if(i==xe&&j==ye)

{

find=1;

print(front);

return(1);

}

for(di=0;di<4;di++)

{

switch(di)

{

case0:i=Qu[front].i-1;j=Qu[front].j;break;

case1:i=Qu[front].i;j=Qu[front].j+1;break;

case2:i=Qu[front].i+1;j=Qu[front].j;break;

case3:i=Qu[front].i;j=Qu[front].j-1;break;

}

if(mg[i][j]==0)

{

rear++;

Qu[rear].i=i;Qu[rear].j=j;

Qu[rear].pre=front;

mg[i][j]=-1;

}

}

}

return(0);

}

voiddstart(inta[22][22])

{

scanf("%d,%d",&stx,&sty);

if(stx>x||sty>y)

{

printf("该坐标点不在迷宫内,请重新输入:\n");

dstart(a);

}

else

{

if(a[sty][stx]==1)

{

printf("该坐标点为墙壁,不能作为起点,请重新输入:\n");

dstart(a);

}

}

}

voiddend(inta[22][22])

{

scanf("%d,%d",&edx,&edy);

if(edx>x||edy>y)

{

printf("该坐标点不在迷宫内,请重新输入:\n");

dend(a);

}

else

{

if(a[edy][edx]==1)

{

printf("该坐标点为墙壁,不能作为终点,请重新输入:\n");

dend(a);

}

}

}

voidmain()

{

readyMG(mg);

printf("输入迷宫的大小。(格式:x,yxy[2,20]的正整数)\n");

scanf("%d,%d",&x,&y);

for(;(x<2)&&(y<2)&(x>20)&&(y>20);)

{

printf("迷宫大小不符合规定,请重新输入:\n");

scanf("%d,%d",&x,&y);

}

printf("输入数据:(1表示墙壁,0表示通路,用空格或回车连接)\n");

for(hang=1;hang<=y;hang++)

{

printf("输入迷宫第%d行数据:\n",hang);

for(lie=1;lie<=x;lie++)

{

scanf("%d",&mg[hang][lie]);

for(;(mg[hang][lie]!=1)&&(mg[hang][lie]!=0);)

{

printf("坐标(%d,%d)的数据错误,请重新输入:\n",lie,hang);

scanf("%d",&mg[hang][lie]);

}

}

}

checkright(mg);

drawMG(mg);

printf("输入起点坐标:(格式:x,y\n");

dstart(mg);

printf("输入终点坐标:(格式:x,y\n");

dend(mg);

mgpath(sty,stx,edy,edx);

printf("系统自动生成图形路径:\n");

drawMG(mg);

}

龙铭洪

写了一个迷宫的代码,还没有测试,你们看看有没有错误。有没有改的地方。

你可能感兴趣的:(优化)