//广度优先搜索..搜索到的第一条路径就是迷宫的最短路径
#include <stdio.h>
struct PointMaze
{
int x; //X坐标
int y; //Y坐标
};
//队列的节点
struct Queue
{
PointMaze Coordinate; //坐标
int prev; //记录前一步的坐标
};
//四周都设为墙之后的迷宫
int maze[7][7] = {
1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 0, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 0, 0, 0, 0, 1,
1, 0, 1, 1, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1
};
//四个方向
const PointMaze step[4] = {{0,-1}, {-1,0}, {0,1}, {1,0} };
int head = 0;
int tail = 0;
int main()
{
//用数组模拟队列
Queue answer[100];
//相当于队列的初始化,并往队列插入第一个元素
answer[0].prev = -1;
answer[0].Coordinate.x = answer[0].Coordinate.y = 1;
maze[1][1] = 1;
++tail;
//因为要打印出路径,所以队列的删除操作并不是真正的删除
//而是把队列的头节点往后移动一个位置
//如果head等于tail 那么队列就为空,如果此时还没收索到路径,则迷宫无解
while(head != tail)
{
int i;
for(i = 0; i < 4; ++i)
{
int x = answer[head].Coordinate.x + step[i].x;
int y = answer[head].Coordinate.y + step[i].y;
//如果x,y可走 则把x,y设为不可走,并且把x,y插入到队列,队列的尾指针后移一个位置
//相当于队列的插入操作
if(maze[x][y] == 0)
{
answer[tail].prev = head;
answer[tail].Coordinate.x = x;
answer[tail].Coordinate.y = y;
++tail;
maze[x][y] = 1;
}
//如果到了最后位置,则就为迷宫的最短路径
//用先前保存的信息将路径找出,并打印
if(x == 5 && y == 5 )
{
int nPos = tail - 1;
int nSize = 0;
PointMaze path[100];
while(nPos != -1)
{
path[nSize].x = answer[nPos].Coordinate.x;
path[nSize].y = answer[nPos].Coordinate.y;
++nSize;
nPos = answer[nPos].prev;
}
for(i = nSize - 1; i >= 0; -- i)
{
printf("(%d,%d)\n", path[i].x-1, path[i].y-1);
}
return 0;
}
}
//如果当前节点已经不可扩展了,则头指针后移动一位
//相当于队列的删除操作
++head;
}
return 0;
}