zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    android:descendantFocusability用法简析
    离开自己的安乐窝
    Android Material Design 中文版
    android Material
    jquery 效果网址分享
    Android判断TextView是否超出加省略号
    如何摆脱工具类
    android 框架
    gridview 横向滚动 一行显示
    自定义 spinner
  • 原文地址:https://www.cnblogs.com/LH2000/p/13065333.html
Copyright © 2011-2022 走看看