CF1365D Solve The Maze(dfs)

如果好人和坏人挨在一起肯定不行

否则讲坏人周围的一圈全部围起来,这样是最优的

之后从n,m处看看能否经过所有的好人

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+10;
char s[60][60];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int vis[60][60];
int res;
int n,m;
void dfs(int x,int y){
    int i;
    for(i=0;i<4;i++){
        int a=x+dx[i];
        int b=y+dy[i];
        if(a&&a<=n&&b&&b<=m&&(!vis[a][b])){
            if(s[a][b]=='#')
                continue ;
            vis[a][b]=1;
            if(s[a][b]=='G'){
                res++;
            }
            dfs(a,b);
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        memset(vis,0,sizeof vis);
        cin>>n>>m;
        int i,j;
        int gcnt=0;
        int sign=0;
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                cin>>s[i][j];
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                if(s[i][j]=='G')
                    gcnt++;
                else if(s[i][j]=='B'){
                    int k;
                    //cout<<i<<" "<<j<<endl;
                    for(k=0;k<4;k++){
                        int a=i+dx[k];
                        int b=j+dy[k];//cout<<a<<" "<<b<<endl;
                        if(a&&a<=n&&b&&b<=m){
                            if(s[a][b]=='G'){
                                sign=1;
                                break;
                            }
                            else if(s[a][b]=='.'){
                                s[a][b]='#';
                            }
                        }
                    }
                }
            }
        }
        res=0;
        if(sign){
            cout<<"NO"<<endl;
            continue;
        }
        if(s[n][m]!='#'){
            vis[n][m]=1;
            dfs(n,m);
        }
        if(res==gcnt)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}
View Code

 

posted @ 2020-07-08 23:07  朝暮不思  阅读(158)  评论(0编辑  收藏  举报