您的位置:首页 > 其它

poj 3984 迷宫问题

2014-02-22 12:33 344 查看
poj   3984   迷宫问题                  题目链接:http://poj.org/problem?id=3984

                     


题目分析:求最短路径用BFS,需要存路径,定义跟图一样大的节点数组,存下每个节点走到时它的上一个点,再把这条路顺着存一遍。

code:

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
bool vis[6][6],map[6][6];
short dir[4][2]={1,0,-1,0,0,1,0,-1},n;
struct node
{
short x,y,step;
}pre[6][6],path[30];//存下来
bool judge(int x,int y)
{
return x<5&&y<5&&x>=0&&y>=0&&!map[x][y]&&!vis[x][y];
}
node bfs()
{
queue<node>q;
node first,next;
first.x=0,first.y=0,first.step=0;
vis[0][0]=true;
q.push(first);
while(!q.empty())
{
first=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=first.x+dir[i][0];
next.y=first.y+dir[i][1];
if(judge(next.x,next.y))
{
next.step=first.step+1;
pre[next.x][next.y]=first;//新的东西在这里
if(next.x==4&&next.y==4)return next;
q.push(next);
vis[next.x][next.y]=true;
}
}
}
return first;
}
int main()
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
scanf("%d",&n);
map[i][j]=n?true:false;
}
}
node p=bfs();
int s=p.step;
for(int i=s;i>=0;i--)
{
path[i]=p;
p=pre[p.x][p.y];
}
for(int i=0;i<=s;i++)
{
printf("(%d, %d)\n",path[i].x,path[i].y);
}
return 0;
}
PS:这题除了打印路径,就没什么亮点了,把样例答案原样输出居然也能过,这些人真是有够无聊……学会BFS打印路径,就能兼具DFS和BFS的所有优点了。

是不是下一步要学A*了呢??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs path 打印路径