1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
//1代表无路,0代表有路
int mg[10][10]= { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} };
typedef struct { int i,j; int pre; }Box; typedef struct { Box data[MaxSize]; int front,rear; }QuType; bool mgpath(int xi,int yi,int xe,int ye); void print(QuType qu,int front); bool mgpath(int xi,int yi,int xe,int ye){ int i,j ,find=0,di; QuType qu; qu.front=qu.rear=-1; qu.rear++; //xi,yi进队 qu.data[qu.rear].i=xi; qu.data[qu.rear].j=yi; qu.data[qu.rear].pre=-1; mg[xi][yi]=-1; //将其赋值为-1,以避免回过来重复搜索 while(qu.front!=qu.rear&&!find) { qu.front++; i=qu.data[qu.front].i; j=qu.data[qu.front].j; if(i==xe&&j==ye){ find=1; print(qu,qu.front); return true; } for(di=0;di<4;di++){ switch(di){ case 0: i=qu.data[qu.front].i-1;j=qu.data[qu.front].j;break; case 1: i=qu.data[qu.front].i;j=qu.data[qu.front].j+1;break; case 2: i=qu.data[qu.front].i+1;j=qu.data[qu.front].j;break; case 3: i=qu.data[qu.front].i;j=qu.data[qu.front].j-1;break; } if(mg[i][j]==0) { qu.rear++; qu.data[qu.rear].i=i; qu.data[qu.rear].j=j; qu.data[qu.rear].pre=qu.front;//指向路径中上一个方块的下标 mg[i][j]=-1;//将其赋值-1,以避免回过来重复搜索 } } } return false; } void print(QuType qu,int front){ int k=front,j,ns=0; printf("\n"); do { j=k; k=qu.data[j].pre; qu.data[j].pre=-1; }while(k!=0); printf("迷宫的路径如下:\n"); k=0; while(k<MaxSize) { if(qu.data[k].pre==-1) { ns++; printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j); if(ns%5==0)printf("\n"); } k++; } printf("\n"); } int main(){ if(!mgpath(1,1,5,5)) printf("该迷宫问题没有解"); }
|
评论