zoukankan      html  css  js  c++  java
  • Codeforces Round #583 D

    • 题意: (x,y)能到(x+1,y)和(x,y+1)问最少阻挡多少个点使(0,0)到不了(n-1,m-1)
    • 思路: 跑两边dfs,第二次跑不能走第一次走过的点,若第一次跑不到终点,答案是0,第二次跑不到终点,答案是1,跑得到则为2.
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e6+10;
    bool blocked[N];
    int n,m;
    bool dfs(int y,int x){
        if(x == m-1 && y == n-1)    return true;
        int i = y*m+x;
        if(y>=n || x>=m || blocked[i])  return false;
     
        if(i>0) blocked[i] = true;
        if(dfs(y,x+1))  return true;
        return dfs(y+1,x);
    }
    int main(){
        cin >> n >> m;
        for(int y=0;y<n;++y){
            string c;
            cin >> c;
            for(int x=0;x<m;++x){
                blocked[y*m+x]  = (c[x]=='#');
            }
        }
        bool reach1 = dfs(0,0);
        bool reach2 = dfs(0,0);
     
        if(!reach1) cout << "0
    ";
        else if(!reach2)    cout <<"1
    ";
        else cout <<"2
    ";
        return 0;
    }
    
    1. 答案只能取0~2
    2. 如果走不到终点,则不需要封点
    3. 第二次dfs时,不经过第一次走的点,可以走到终点,说明至少有两条不重合的路径可以到达终点,则必须封掉两个点.如果走不到终点,则说明两条到终点的路径最少有一点是重合的,把那一点封掉即可
    4. 由于题目给的是n*m的范围,需要将两维的坐标换算成一维的 (idx = y*m+x)
  • 相关阅读:
    谷歌json数据格式化插件
    引用图片出现403的解决办法
    CSS Sprite
    语义化标签
    响应式布局
    CSS浮动布局详解
    ELK华为云的镜像下载地址(ElasticSearch,logstash,kibana)
    redis集群方案--高可用集群
    redis集群方案--哨兵模式
    Redis集群实现分布式锁-RedLock
  • 原文地址:https://www.cnblogs.com/xxrlz/p/11462179.html
Copyright © 2011-2022 走看看