题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2531
题解 :这个题目的坑就是D的个数,一开始天真的一位就2个,不是这样的,D的数目是不定的。所以我们先找到一个D,让这个D做为头,然后再用一个数组记录其他D与该D的相对位置就好了,然后再BFS判断
#include<bits/stdc++.h> using namespace std; const int N=1e3+7; char arr[N][N]; int s1,e1,s2,e2; int n,m; int xx,yy; int mark[N][N]; int bodyx[N]; int bodyy[N]; int pos; int d[4][2]={1,0,0,1,-1,0,0,-1}; struct stu{ int a,b; int sum; }; int ans; bool judge(int x,int y){ if(mark[x][y]) return 0; if(x<0||y<0||x>=n||y>=m) return 0; if(arr[x][y]=='O') return 0; for(int i=0;i<pos;i++){ int dx=bodyx[i]+x; int dy=bodyy[i]+y; if(dx<0||dy<0||dx>=n||dy>=m||dx<0||dy<0||arr[dx][dy]=='O') return 0; } return 1; } bool juju(int x,int y){ if(arr[x][y]=='Q') return 1; for(int i=0;i<pos;i++){ int dx=x+bodyx[i]; int dy=y+bodyy[i]; if(arr[dx][dy]=='Q') return 1; } return 0; } void bfs(int x1,int y){ queue<stu>que; que.push({x1,y,0}); mark[x1][y]=1; while(que.size()){ stu x=que.front(); que.pop(); if(juju(x.a,x.b)){ ans=x.sum; break; } for(int i=0;i<4;i++){ int dx=x.a+d[i][0]; int dy=x.b+d[i][1]; if(judge(dx,dy)){ que.push({dx,dy,x.sum+1}); mark[dx][dy]=1; } } } } int main(){ while(cin>>n>>m){ if(n==0||m==0) break; memset(mark,0,sizeof(mark)); s1=-1; ans=-1; pos=0; for(int i=0;i<n;i++) scanf("%s",arr[i]); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(arr[i][j]=='D'&&s1!=-1){ bodyx[pos]=i; bodyy[pos++]=j; } else if(arr[i][j]=='D'){ s1=i,e1=j; } } } for(int i=0;i<pos;i++){ bodyx[i]=bodyx[i]-s1; bodyy[i]=bodyy[i]-e1; } bfs(s1,e1); if(ans!=-1) cout<<ans<<endl; else cout<<"Impossible"<<endl; } return 0; }