迷宫求解(队列算法)

/* * 迷宫求解 * */ #include<stdio.h> #include<stdlib.h> #define MAXSIZE 50 #define M 10 int mg[M][M] ={ // 此迷宫有三条路径 {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,1,1,1,1,1}, {1,0,1,0,0,0,0,1,1,1}, {1,0,0,1,1,1,0,1,1,1}, {1,1,0,1,1,1,0,0,0,1}, {1,1,0,1,1,1,1,1,0,1}, {1,0,0,0,0,0,1,1,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; // ------------------ 栈定义 ------------------------- struct{ int i,j; // 方块的位置 int pre; // 本路径中上一方块在路径中的下标 }Qu[MAXSIZE]; void print(int front); /* * 利用队列求解迷宫 */ void mgpath(int x1, int y1, int x2, int y2) { int front,rear; int find =0; int i,j; int di; front=-1; rear=-1; rear++; // (x1,y1)入队 Qu[rear].i = x1; Qu[rear].j = y1; Qu[rear].pre = -1; mg[x1][y1]=-1; // 置为-1, 以免重复搜索 while(front<=rear && !find) { front++; // 出队 i = Qu[front].i; j = Qu[front].j; if(i == x2 && j == y2) // 出口 { find = 1; print(front); } for(di=0;di<3;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; } // if } // for } // while if(!find) printf("找不到可走路径"); } void print(int front) { int f,j; int ns=0; f=front; printf("/n"); do{ j = f; f = Qu[f].pre; Qu[j].pre = -1; //把当前的设为 -1 }while(f!=0); printf("路径如下:/n"); f=0; while(f<MAXSIZE) { if(Qu[f].pre==-1) { ns++; printf("/t(%d,%d)",Qu[f].i,Qu[f].j); if(ns%5 == 0) printf("/n"); } f++; } } void main() { mgpath(1,1,8,8); }

你可能感兴趣的:(迷宫求解(队列算法))