Catch him 杭电 2531

题目链接: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;
}
原文地址:https://www.cnblogs.com/Accepting/p/11596811.html