最后还是被包工头赶出了工地,有什么大不了的,大不了自己干,,,,,莫名想哭,噩梦明明醒了,怎么不开心呢
题目链接:http://poj.org/problem?id=3984
一个最短路问题,使用广搜就可以解决,不过这道题目的问题在于需要记忆最短路径,所以不妨借用二叉树的思想,使得每一个位置记忆自己前一位的位置就可以在最后利用终点的位置,回溯找到路径,下面是AC代码。
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#define INF 1000100;
using namespace std;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int s[6][6], visit[6][6];
struct edge
{
int x;
int y;
int xq;
int ag;
};
edge wei[6][6];
void bfs(void);
int main(void)
{
int i, j, k, n, m;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
scanf("%d", &s[i][j]);
visit[i][j]=INF;
}
}
bfs();
n = visit[4][4];
stack<edge> SE;
i = 4;
j = 4;
edge r;
r.x = 4;
r.y = 4;
SE.push(r);
n = n -1;
while(n--)
{
int ii = i;
int jj = j;
i = wei[ii][jj].xq;
j = wei[ii][jj].ag;
edge w;
w.x = i;
w.y = j;
SE.push(w);
}
while(!SE.empty())
{
edge u = SE.top();
SE.pop();
printf("(%d, %d)\n", u.x, u.y);
}
return 0;
}
void bfs()
{
queue<edge> Que;
edge t;
t.x = 0;
t.y = 0;
Que.push(t);
visit[0][0] = 1;
while(!Que.empty())
{
edge st = Que.front();
Que.pop();
for(int i = 0; i < 3; i++)
{
int nx = st.x + dx[i];
int ny = st.y + dy[i];
if((nx>=0)&&(ny>=0)&&(nx<5)&&(ny<5)&&(s[nx][ny]==0))
{
if(visit[nx][ny]>(visit[st.x][st.y]+1))
{
visit[nx][ny]=visit[st.x][st.y]+1;
edge o;
o.x = nx;
o.y = ny;
wei[nx][ny].xq = st.x;
wei[nx][ny].ag = st.y;
Que.push(o);
}
}
}
}
}