题目:http://poj.org/problem?id=3984
思路:结构体(下标 + 路径方向) + bfs + queue(填充所有能走的路径) + stack(记录所有走过路径)
最后再遍历栈,通过到往终点的方向来判断,将栈中的其他路径排除。
代码:
#include <bits/stdc++.h>
using namespace std;
#define SIZE_X 5
#define SIZE_Y 5
struct Subs
{
int i, j;
int dir;
Subs() {}
Subs(int x, int y) : i(x), j(y) {}
Subs(int x, int y, int dir) : i(x), j(y), dir(dir) {}
};
bool operator==(const Subs&pt, const Subs&pe)
{
return pt.i == pe.i && pt.j == pe.j;
}
stack<Subs> bfs(int maze[][SIZE_Y], Subs ps, Subs pe)
{
queue<Subs> q;
stack<Subs> path;
q.push(ps);
while(!q.empty())
{
ps = q.front();
q.pop();
path.push(ps);
maze[ps.i][ps.j] = 2;
if (pos == pe)
return path;
if (maze[ps.i + 1][ps.j] == 0 && ps.i + 1 < SIZE_X)
{
Subs n(ps.i + 1, ps.j, 1); // down
q.push(n);
}
if (maze[ps.i][ps.j + 1] == 0 && ps.j + 1 < SIZE_Y)
{
Subs n(ps.i, ps.j + 1, 2); // right
q.push(n);
}
if (maze[ps.i - 1][ps.j] == 0 && ps.i - 1 > -1)
{
Subs n(ps.i - 1, ps.j, 3); // up
q.push(n);
}
if (maze[ps.i][ps.j - 1] == 0 && ps.j - 1 > -1)
{
Subs n(ps.i, ps.j - 1, 4); // left
q.push(n);
}
}
return path;
}
int main()
{
Subs ps(0,0);
Subs pe(4,4);
/*
int maze[SIZE_X][SIZE_Y] = {
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
};
*/
int maze[SIZE_X][SIZE_Y];
for (int i = 0; i < SIZE_X; i++)
for( int j = 0; j < SIZE_Y; j++)
cin >> maze[i][j];
stack<Subs> path = bfs(maze, ps, pe);
stack<Subs> truepath;
truepath.push(path.top());
path.pop();
while(!path.empty())
{
Subs n = path.top();
path.pop();
if (truepath.top().dir == 1 &&
n.i + 1 == truepath.top().i && n.j == truepath.top().j)
truepath.push(n);
else if (truepath.top().dir == 2 &&
n.i == truepath.top().i && n.j + 1 == truepath.top().j)
truepath.push(n);
else if (truepath.top().dir == 3 &&
n.i - 1 == truepath.top().i && n.j == truepath.top().j)
truepath.push(n);
else if (truepath.top().dir == 4 &&
n.i == truepath.top().i && n.j - 1 == truepath.top().j)
truepath.push(n);
}
while (!truepath.empty())
{
printf("(%d,%d)\n", truepath.top().i, truepath.top().j);
truepath.pop();
}
/*
for(int i = 0; i < SIZE_X; i++)
{
for(int j = 0; j < SIZE_Y; j++)
printf("%d ", maze[i][j]);
puts("");
}
*/
return 0;
}
Output:
$ ./test (0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4) 2 1 2 2 0 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 2