-
E - Knights of Ni
- POJ - 3170
- 题意:一个人去草丛取一个物去找另一个人,然后2,3分别是两个人,4为草丛,1为禁止走的区域求最短完成步数
- 思路:也就是挑一个草丛能够最快完成,第一次以2为起点进行bfs记录到达每个草丛的时间第二次以3为起点 进行 bfs
- 直接动态更新最小值即可。
-
#include<iostream> #include<cstring> #include<queue> #include<stdio.h> using namespace std; #define maxn 1005 int ans,n,m,sx,sy,ex,ey; bool vis[maxn][maxn]; int mmp[maxn][maxn]; int dis[maxn][maxn]; struct node { int x,y,step; } temp,top; int to[4][2]= {{1,0},{-1,0},{0,-1},{0,1}}; bool judge(int x,int y) { if(x<0||y<0||x>=n||y>=m||vis[x][y]||mmp[x][y]==1)return false; return true; } void bfs(int x,int y) { queue<node>q; vis[x][y]=1; q.push(node{x,y,0}); while(!q.empty()) { top=q.front(); q.pop(); dis[top.x][top.y]=top.step; for(int i=0; i<4; i++) { temp.x=top.x+to[i][0]; temp.y=top.y+to[i][1]; if(judge(temp.x,temp.y)) { vis[temp.x][temp.y]=1; temp.step=top.step+1; q.push(temp); } } } } void bfs2(int x,int y) { queue<node>q; vis[x][y]=1; q.push(node{x,y,0}); while(!q.empty()) { top=q.front(); q.pop(); if(mmp[top.x][top.y]==4) ans=min(ans,top.step+dis[top.x][top.y]); for(int i=0; i<4; i++) { temp.x=top.x+to[i][0]; temp.y=top.y+to[i][1]; if(judge(temp.x,temp.y)) { vis[temp.x][temp.y]=1; temp.step=top.step+1; q.push(temp); } } } } int main() { ans=1e9; scanf("%d%d",&m,&n); for(int i=0; i<n; i++) for(int j=0; j<m; j++) { scanf("%d",&mmp[i][j]); if(mmp[i][j]==2)sx=i,sy=j; if(mmp[i][j]==3)ex=i,ey=j; } memset(vis,0,sizeof(vis)); bfs(sx,sy); memset(vis,0,sizeof(vis)); bfs2(ex,ey); printf("%d\n",ans); return 0; }
E - Knights of Ni POJ -两次-BFS
最新推荐文章于 2021-02-22 22:48:21 发布
本文详细解析了POJ-3170问题的解决方案,通过两次宽度优先搜索(BFS)策略,寻找从两个不同起点出发,经过特定区域并最终会合的最短路径。文章提供了完整的C++代码实现,展示了如何利用动态更新最小值的方法来高效解决问题。
320

被折叠的 条评论
为什么被折叠?



