poj 2049 Finding Nemo(优先队列+bfs)
2013-08-07 17:30
465 查看
题目:http://poj.org/problem?id=2049
题意:
有一个迷宫,在迷宫中有墙与门 有m道墙,每一道墙表示为(x,y,d,t)
x,y表示墙的起始坐标
d为0即向右t个单位,都是墙
d为1即向上t个单位,都是墙
有n道门,每一道门表示为(x,y,d)
x,y表示门的起始坐标
d为0即向右一个单位表示门
d为1即向上一个单位表示门
再给出你起点的位置(f1,f2),并保证这个点的位置不会再墙或者门中,为起点到(0,0)最少要穿过多少条门
代码是根据网上大神的稍微改了一下,就交了
题意:
有一个迷宫,在迷宫中有墙与门 有m道墙,每一道墙表示为(x,y,d,t)
x,y表示墙的起始坐标
d为0即向右t个单位,都是墙
d为1即向上t个单位,都是墙
有n道门,每一道门表示为(x,y,d)
x,y表示门的起始坐标
d为0即向右一个单位表示门
d为1即向上一个单位表示门
再给出你起点的位置(f1,f2),并保证这个点的位置不会再墙或者门中,为起点到(0,0)最少要穿过多少条门
代码是根据网上大神的稍微改了一下,就交了
#include <iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<stack> #include<queue> #include<cmath> #include<algorithm> using namespace std; #define maxn 250 #define inf 99999999 struct node { int x; int y; int len; bool operator <(const node &a)const//运算符重载,就是根据len从小到大排序 { return len>a.len; } }; int n,m,sx,sy,xmax,ymax; int dis[maxn][maxn],h[maxn][maxn],l[maxn][maxn]; priority_queue<node>q; void bfs() { int x,y; for(x=0; x<=xmax; x++) { for(y=0; y<=ymax; y++) dis[x][y]=inf; } while(!q.empty())q.pop(); node pn; pn.x=0; pn.y=0; pn.len=0; dis[0][0]=0; q.push(pn); while(!q.empty()) { pn=q.top(); q.pop(); x=pn.x; y=pn.y; if(x==sx&&y==sy)return ; //向上走 if(y+1<=ymax&&dis[x][y+1]>dis[x][y]+h[x][y+1]) { dis[x][y+1]=dis[x][y]+h[x][y+1]; pn.x=x; pn.y=y+1; pn.len=dis[x][y+1]; q.push(pn); } if(y-1>=0&&dis[x][y-1]>dis[x][y]+h[x][y])//向下走 { dis[x][y-1]=dis[x][y]+h[x][y]; pn.x=x; pn.y=y-1; pn.len=dis[x][y-1]; q.push(pn); } if(x-1>=0&&dis[x-1][y]>dis[x][y]+l[x][y])//向左走 { dis[x-1][y]=dis[x][y]+l[x][y]; pn.x=x-1; pn.y=y; pn.len=dis[x-1][y]; q.push(pn); } if(x+1<=xmax&&dis[x+1][y]>dis[x][y]+l[x+1][y])//向右走 { dis[x+1][y]=dis[x][y]+l[x+1][y]; pn.x=x+1; pn.y=y; pn.len=dis[x+1][y]; q.push(pn); } } dis[sx][sy]=-1; } int main() { int i,j,x,y,d,t; double tx,ty; while(scanf("%d%d",&n,&m)!=EOF) { if(m==-1&&n==-1)break; xmax=ymax=-1; memset(h,0,sizeof(h)); memset(l,0,sizeof(l)); for(i=0; i<n; i++) { scanf("%d%d%d%d",&x,&y,&d,&t); if(d==0) { for(j=0; j<t; j++) { h[x+j][y]=inf; } xmax=max(xmax,x+t); ymax=max(ymax,y); } else { for(j=0; j<t; j++) { l[x][y+j]=inf; } xmax=max(xmax,x); ymax=max(ymax,y+t); } } for(i=0; i<m; i++) { scanf("%d%d%d",&x,&y,&d); if(d==0) { h[x][y]=1; } else l[x][y]=1; } scanf("%lf%lf",&tx,&ty); if(tx>xmax||ty>ymax) { printf("0\n"); } else { sx=(int)tx; sy=(int)ty; bfs(); printf("%d\n",dis[sx][sy]); } } }
相关文章推荐
- poj-2049 Finding Nemo-BFS
- POJ 2049 Finding Nemo BFS 三维数组存状态, 优先队列优化时间与空间
- poj-2049-Finding Nemo-BFS
- poj 2049 Finding Nemo (反过来使用bfs)
- poj 2049 Finding Nemo(bfs+dij 建图难)
- poj2049——Finding Nemo(bfs)
- poj 2049 Finding Nemo(bfs)
- POJ 2049 Finding Nemo (网格中的BFS)
- POJ 2049 Finding Nemo 网格bfs
- POJ训练计划2049_Finding Nemo(建图/BFS)
- Finding Nemo POJ 2049(三维BFS)
- POJ 2049— Finding Nemo(三维BFS)10/200
- Finding Nemo (poj 2049 超级蛋疼的bfs)
- POJ 2049 Finding Nemo ( BFS)
- POJ 2049 Finding Nemo(三维BFS)
- Finding Nemo POJ 2049(bfs+dp思想)
- 【POJ】 2049 Finding Nemo BFS
- POJ 2049-Finding Nemo(三维bfs解决类迷宫问题)
- POJ Finding Nemo 2049 (bfs)
- POJ-2049-Finding Nemo(BFS)