迷宫的代码 不知道还有优化的地方没有
写了一个迷宫的代码,还没有测试,你们看看有没有错误。有没有改的地方。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int x,y,mg[22][22]; int hang,lie;
int stx,sty,edx,edy;
void readyMG(int a[22][22])
{
for(hang=0;hang<=11;hang++)
{
for(lie=0;lie<=11;lie++)
{
mg[lie][hang]=1;
}
}
}
void drawMG(int a[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");
}
}
void checkright(int a[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");
}
typedef struct qnode
{
int data[400];
struct qnode *next;
}QNode;
typedef struct
{
QNode * front;
QNode * rear;
}LiQueue;
void InitQueue(LiQueue * &q)
{
q=(LiQueue * )malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
void ClearQueue(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);
}
int QueueEmpty(LiQueue *q)
{
if(q->rear==NULL)
return 1;
else
return 0;
}
struct
{
int i,j;
int pre;
}Qu[100];
int front=-1,rear=-1;
void print(int front)
{
int k=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");
}
int mgpath(int xi,int yi,int xe,int ye)
{
int i,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)
{
case 0:i=Qu[front].i-1;j=Qu[front].j;break;
case 1:i=Qu[front].i;j=Qu[front].j+1;break;
case 2:i=Qu[front].i+1;j=Qu[front].j;break;
case 3: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);
}
void dstart(int a[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);
}
}
}
void dend(int a[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);
}
}
}
void main()
{
readyMG(mg);
printf("输入迷宫的大小。(格式:x,y,x和y为[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);
}
龙铭洪
写了一个迷宫的代码,还没有测试,你们看看有没有错误。有没有改的地方。