HDU2612 Find a way 双向BFS
网址:https://vjudge.net/problem/HDU-2612
题意:
地图上分布着一些KCF(?),有两个人在其出发点,地图上‘#’表示不能走的格子, ‘.’表示可以走的格子,‘@’表示可行的目的地。两个人从出发点出发,移动一个需要代价是$1$,并且不能经过对方的出发点,求代价和的最小值。
题解:
建好图之后对这两个人跑一次bfs然后枚举最小值即可。
AC代码:
#include <iostream> #include <queue> #include <cstring> using namespace std; int dep1[40005],dep2[40005]; char ch[205][205]; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int n,m,l,a,b; int res[40005]; bool check(int x,int y,char s) { if(x>=n||x<0||y>=m||y<0) return false; if(ch[x][y]=='#'||ch[x][y]==s) return false; return true; } void print(int *dep) { for(int i=0;i<n;++i) { for(int j=0;j<m;++j) cout<<dep[i*m+j]<<" "; cout<<endl; } } void bfs(int s,int *dep,char k) { queue<int>que; dep[s]=1; que.push(s); while(!que.empty()) { int t=que.front(); que.pop(); //cout<<"t="<<t<<endl; int x=t/m,y=t%m; //cout<<x<<" "<<y<<endl; for(int i=0;i<4;++i) { if(check(x+dir[i][0],y+dir[i][1],k)) if(dep[(x+dir[i][0])*m+y+dir[i][1]]==0) { //cout<<(x+dir[i][0])*m<<" "<<y+dir[i][1]<<endl; dep[(x+dir[i][0])*m+y+dir[i][1]]=dep[t]+1; que.push((x+dir[i][0])*m+y+dir[i][1]); //print(dep); //cout<<endl; } } } //cout<<endl; } void solve() { int ans=0x3f3f3f3f; for(int i=0;i<l;++i) if(dep1[res[i]]&&dep2[res[i]]&&ans>dep1[res[i]]+dep2[res[i]]) ans=dep1[res[i]]+dep2[res[i]]; cout<<(ans-2)*11<<endl; } int main() { while(cin>>n>>m) { memset(ch,0,sizeof(ch)); memset(dep1,0,sizeof(dep1)); memset(dep2,0,sizeof(dep2)); l=0; for(int i=0;i<n;++i) for(int j=0;j<m;++j) { cin>>ch[i][j]; if(ch[i][j]=='Y') a=i*m+j; else if(ch[i][j]=='M') b=i*m+j; else if(ch[i][j]=='@') res[l++]=i*m+j; } /*for(int i=0;i<n;++i) { for(int j=0;j<m;++j) cout<<ch[i][j]<<" "; cout<<endl; } cout<<l<<" "<<a<<" "<<b<<" "<<endl; for(int i=0;i<l;++i) cout<<res[i]<<endl;*/ bfs(a,dep1,'M'); bfs(b,dep2,'Y'); solve(); } return 0; }