POJ 3170 BFS 水题
2014-03-19 00:05
344 查看
第一次把寻找从开始点到每个草莓的最短路
第二次寻找每个草莓到守护者的最短路
两次 BFS 就是了,注意第一次不能通过 3
第二次寻找每个草莓到守护者的最短路
两次 BFS 就是了,注意第一次不能通过 3
#include <stdio.h> #include <iostream> #include <queue> #include <algorithm> #include <map> #include <vector> #include <cmath> #include <string.h> #include <stdlib.h> #include <time.h> #include <fstream> #include <set> #include <stack> using namespace std; #define READ freopen("acm.in","r",stdin) #define WRITE freopen("acm.out","w",stdout) #define ll long long #define ull unsigned long long #define PII pair<int,int> #define PDI pair<double,int> #define PDD pair<double,double> #define MII map<int,int>::iterator #define fst first #define sec second #define MS(x,d) memset(x,d,sizeof(x)) #define INF 0x3f3f3f3f #define ALL(x) x.begin(),x.end() #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ROOT 0,n-1,1 #define PB push_back #define FOR(a,b,c) for(int a=b;a<c;a++) #define MOD 1000000007 #define keyTree (ch[ ch[root][1] ][0]) #define MAX 200000 int b[1111][1111]; PII S,T; int n,m; bool used[1111][1111]; int dist1[1111][1111]; int dist2[1111][1111]; int dir[4][2]={0,1,1,0,-1,0,0,-1}; vector<PII> cm; void bfs(PII s,bool flag,int dist[][1111]) { queue<PII> q; q.push(s); MS(used,0); used[s.fst][s.sec]=1; dist[s.fst][s.sec]=0; int cnt=0; while(!q.empty()) { PII p=q.front();q.pop(); int x=p.fst,y=p.sec; if(b[x][y]==4) cnt++; if(cnt==cm.size()) return; for(int i=0;i<4;i++) { int tx=x+dir[i][0]; int ty=y+dir[i][1]; if(tx>=0&&tx<n&&ty>=0&&ty<m&&b[tx][ty]!=1&&!used[tx][ty]) { if(!flag&&b[tx][ty]==3) continue; dist[tx][ty]=dist[x][y]+1; used[tx][ty]=1; q.push(PII(tx,ty)); } } } } int main() { while(scanf("%d%d",&m,&n)!=EOF) { cm.clear(); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { int t; scanf("%d",&t); if(t==2) S.fst=i,S.sec=j; if(t==3) T.fst=i,T.sec=j; if(t==4) cm.PB(PII(i,j)); b[i][j]=t; } int ans=INF; MS(dist1,0);MS(dist2,0); bfs(S,0,dist1); bfs(T,1,dist2); for(int i=0;i<cm.size();i++) { int x=cm[i].fst,y=cm[i].sec; if(dist1[x][y]&&dist2[x][y]) { ans=min(ans,dist1[x][y]+dist2[x][y]); } } cout<<ans<<endl; } }
相关文章推荐
- POJ 3170(bfs求最短路)
- POJ 3170 Knights of Ni(两次BFS啊)
- POJ 3984 迷宫问题 (BFS,水题)
- poj 3669 bfs水题预处理
- POJ 3170--双重BFS
- poj入门水题--宽搜(bfs)题 1979 1562 2386 3278
- POJ3278 BFS 水题
- POJ 3170 Knights of Ni (暴力,双向BFS)
- POJ3278 BFS 水题
- POJ 3170(Knights of Ni)(BFS)
- POJ-3984迷宫问题 (BFS,水题)
- poj 3414 bfs水题但是麻烦
- poj 3170 Knights of Ni (bfs)
- POJ 2251 Dungeon Master <三维BFS水题>
- POJ 3170 Knights of Ni (双向BFS打表记录)
- hdu 1241 || poj 1562 Oil Deposits(搜索:BFS水题)
- ZOJ 1091 POJ 2935 Knight Moves BFS水题
- Poj 1426 (Bfs 水题)
- poj 3669 Meteor Shower bfs水题
- POJ 3369 Meteor Shower (BFS,水题)