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\n";
    else if(!reach2)    cout <<"1\n";
    else cout <<"2\n";
    return 0;
}
  1. 答案只能取0~2
  2. 如果走不到终点,则不需要封点
  3. 第二次dfs时,不经过第一次走的点,可以走到终点,说明至少有两条不重合的路径可以到达终点,则必须封掉两个点.如果走不到终点,则说明两条到终点的路径最少有一点是重合的,把那一点封掉即可
  4. 由于题目给的是n*m的范围,需要将两维的坐标换算成一维的 \(idx = y*m+x\)
posted @ 2019-09-04 23:01  新新人類  阅读(186)  评论(0编辑  收藏  举报