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

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

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

}

龙铭洪

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

posted @ 2012-06-28 20:16  龙铭洪官方网站  阅读(167)  评论(0编辑  收藏  举报