问题:
利用队列的假出队,实现迷官问题寻解。
要求:
0 墙 1 路, 寻找最短路, 如果有多条,输出其中一条路。
main.c
#include <stdio.h>
#include <stdlib.h>
#define M 5
int map[M+2][M+2];
int front = 0, rear = 0;
typedef struct Point_def{
int x;
int y;
int pre;
}Point;
Point q[(M+2)*(M+2)];
typedef struct direction_def{
int x;
int y;
}Direction;
Direction direct[4] = {
{-1,0}, {0,1}, {1,0}, {0, -1}
};
int isEmpty(){
return front==rear?1:0;
}
void initMap(){
int i, j;
for (i=0; i<M+2; i++)
for (j=0; j<M+2; j++){
if (i == 0 || i == M+1 || j == 0 || j == M+1){
map[i][j] = 0; continue;
}
scanf("%d", &map[i][j]);
}
}
void enQueue(Point p){
q[rear++] = p;
}
Point deQueue(){
if (isEmpty())
exit(1);
return q[front++];
}
void findPath(int start_x, int start_y, int end_x, int end_y){
int flag = 0;
int d;
int i, j;
Point tmp_p1={start_x, start_y, -1};
Point tmp_p2;
enQueue(tmp_p1);
while (!flag){
tmp_p1 = deQueue();
map[tmp_p1.x][tmp_p1.y] = -1;
for (d=0; d<4; d++){
i = tmp_p1.x + direct[d].x;
j = tmp_p1.y + direct[d].y;
if (map[i][j] == 1){
tmp_p2.x = i; tmp_p2.y = j; tmp_p2.pre = front-1;
enQueue(tmp_p2);
}
if (i == end_x && j == end_y){
tmp_p2.x = i; tmp_p2.y = j; tmp_p2.pre = front-1;
enQueue(tmp_p2);
flag = 1;
break;
}
}// end for
}// end while
}// end findPath
void printPath(){
int k = rear-1;
while (k != -1){
printf("(%d,%d)
", q[k].x, q[k].y);
k = q[k].pre;
}
}
int main(){
int flag = 0;
int start_x = 1, start_y = 1;
int end_x = 5, end_y = 5;
initMap();
findPath(start_x, start_y, end_x, end_y);
printPath();
return 0;
}