zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    三种构建器的使用
    java class file
    JVM知识(下)
    JVM知识(上)
    初识JMM
    nginx基础配置加基础实战演示
    GitHub中webhooks的使用
    redis sentinel介绍
    redis主从复制
    【开源】.net 分布式架构之监控平台
  • 原文地址:https://www.cnblogs.com/Accepting/p/11596811.html
Copyright © 2011-2022 走看看