POJ 3170 BFS 水题

来源:互联网 发布:移除数组中的重复元素 编辑:程序博客网 时间:2024/06/08 10:40

第一次把寻找从开始点到每个草莓的最短路

第二次寻找每个草莓到守护者的最短路

两次 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 200000int 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;}}


1 0
原创粉丝点击