POJ-3984
Description
定义一个二维数组:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
思路
采用BFS求解最短路径,记忆化搜索,使用栈输出路径。
C++代码
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
struct node
{
int x;
int y;
int pre;
int now;
}Node;
node path[100000];
int maze[5][5];
bool inq[5][5] = { false };
int X[4] = { 0,0,1,-1 };
int Y[4] = { 1,-1,0,0 };
int sum = 0;
bool judge(int x,int y)
{
if (x < 0 || y < 0 || x>4 || y>4 || inq[x][y] == true || maze[x][y] == 1)
return false;
else
return true;
}
int BFS()
{
queue<node> q;
Node.x = 0, Node.y = 0;
Node.pre = -1, Node.now = 0;
q.push(Node);
path[0] = Node;
while (!q.empty())
{
node top = q.front();
q.pop();
if (top.x == 4 && top.y == 4)//终点
return top.now;
for (int i = 0; i < 4; i++)
{
int newX = top.x + X[i];
int newY = top.y + Y[i];
if (judge(newX, newY))
{
Node.x = newX, Node.y = newY;
Node.pre = top.now;
Node.now = ++sum;
q.push(Node);
path[sum] = Node;
inq[newX][newY] = true;
}
}
}
}
int main()
{
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
cin >> maze[i][j];
stack<node> res;
int id = BFS();
while (id != -1)
{
res.push(path[id]);
id = path[id].pre;
}
while (!res.empty())
{
node top = res.top();
cout << "(" << top.x << ", " << top.y << ")" << endl;
res.pop();
}
}