上一次用的DFS,这次BFS,直接在地图上扩展结点,如下图所示:
橙黄色代表起点,浅蓝色终点。
#include <cstdio>
#include <queue>
using namespace std;
#define ACCESS 0
struct position
{
int x, y;
}start, end;
const int direction[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
queue<position> toExpandPosition;
void BFSExploreMaze(int &minStep)
{
int i;
int mazeMap[9][9] =
{
1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1
};
position currentPos, adjacentPos;
while (!toExpandPosition.empty())
{
toExpandPosition.pop();
}
toExpandPosition.push(start);
while (!toExpandPosition.empty())
{
currentPos = toExpandPosition.front();
toExpandPosition.pop();
if (currentPos.x == end.x && currentPos.y == end.y)
{
minStep = mazeMap[currentPos.x][currentPos.y];
return;
}
for (i = 0; i < 4; i++)
{
adjacentPos.x = currentPos.x + direction[i][0];
adjacentPos.y = currentPos.y + direction[i][1];
if (mazeMap[adjacentPos.x][adjacentPos.y] == ACCESS)
{
mazeMap[adjacentPos.x][adjacentPos.y] =
mazeMap[currentPos.x][currentPos.y] + 1;
toExpandPosition.push(adjacentPos);
}
}
}
}
int main()
{
int testNum, minStep;
scanf("%d", &testNum);
while (testNum-- != 0)
{
scanf("%d%d%d%d", &start.x, &start.y, &end.x, &end.y);
BFSExploreMaze(minStep);
printf("%d\n", minStep);
}
return 0;
}