• Codeforces Round #648 (Div. 2).D Solve The Maze


    http://codeforces.com/contest/1365/problem/D

    题目大意

    给一个n m图,图上有好人 坏人 空地 墙 四种元素。墙不可通过。你可以任意设置墙,问有没有一种设置方法使得好人都可以到n m点 坏人都不行。

    做法

     遍历整个图,找到所有的G点,从每一个好人点出发,看能否到达终点,路径上如果有相邻的“B”点,则确定为此路不通,否则无法堵住B。这样都遍历完了以后如果存在G点无法到达终点就no否则yes。 中间需要一个小优化。如果一个G点附近有G点并且没有B点,则把这个点变成 ' . '   这样就省去了一个dfs。不这样做会超时。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    char a[55][55];
    int vis[55][55];
    int n,m;
    int dfs(int y,int x){
        if(a[y+1][x]=='B'||a[y-1][x]=='B'||a[y][x+1]=='B'||a[y][x-1]=='B'){
            return 0;
        }
        if(y==n&&x==m){
            return 1;
        }
        if(a[y+1][x]=='.'||a[y+1][x]=='G'){
            if(!vis[y+1][x]){
                vis[y+1][x]=1;
                if(dfs(y+1,x)){
                    vis[y+1][x]=0;
                    return 1;
                }
            }
        }
        if(a[y-1][x]=='.'||a[y-1][x]=='G'){
            if(!vis[y-1][x]){
                vis[y-1][x]=1;
                if(dfs(y-1,x)){
                    vis[y-1][x]=0;
                    return 1;
                }
            }
        }
        if(a[y][x+1]=='.'||a[y][x+1]=='G'){
            if(!vis[y][x+1]){
                vis[y][x+1]=1;
                if(dfs(y,x+1)){
                    vis[y][x+1]=0;
                    return 1;
                }
            }
        }
        if(a[y][x-1]=='.'||a[y][x-1]=='G'){
            if(!vis[y][x-1]){
                vis[y][x-1]=1;
                if(dfs(y,x-1)){
                    vis[y][x-1]=0;
                    return 1;
                }
            }
        }
        return 0;
    }
    void solve(){
        memset(a,0,sizeof(a));
        cin>>n>>m;
        for(int i=1;i<=n;i++){
        scanf("%s",a[i]+1);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]=='G'){
                    if(a[i+1][j]=='G'||a[i-1][j]=='G'||a[i][j+1]=='G'||a[i][j-1]=='G'){
                        if(a[i+1][j]!='B'&&a[i-1][j]!='B'&&a[i][j+1]!='B'&&a[i][j-1]!='B'){
                        a[i][j]='.';
                        continue;
                    }
                    }
                    memset(vis,0,sizeof(vis));
                    if(!dfs(i,j))
                    {
                        cout<<"No"<<endl;
                        return ;
                    }
                } 
            }
        }
        cout<<"Yes"<<endl;
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
            solve();
        }
    }
    rush!
  • 相关阅读:
    video兼容ie,ckplayer网页播放器
    边框在2个边,不重叠不接触的情况下是梯形。
    【Unity】关于屏幕自适应的思路
    【Unity】鼠标指向某物体,在其上显示物体的名字等等等等信息
    【C#】关于左移/右移运算符的使用
    【Unity】鼠标点选物体
    Python time和datetime模块
    Python 模块之间的调用
    SaltStack 使用pillar安装配置管理zabbix
    SaltStack 实践课程一
  • 原文地址:https://www.cnblogs.com/LH2000/p/13065333.html
Copyright © 2020-2023  润新知