CF1214D

CF1214D

質問の意味:

あなたの$ n \倍メートルの$行列を付け、使用する障壁の最小数を見つけ、$(1,1)$パス$(n、m)は$がブロックされています。

質問の意味:

ので、答えは$ 2 $までですので、答えはたったの$ 0,1,2 $であるように、両側の出発点は、ブロックすることができます。
DFSは、二回ポイントは、各ステップにおける点の数が一つだけに到達するかどうかを確認するために$ $(n、m)は$に達することができる達する第1の$(1,1)の両方から引き抜か。

コード:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define LL long long
#define N 1000010

int n,m,s,ans,f;
bool vis[N];
char ch[N];

void dfs(int x) {
    if(ans) return;
    if(x == f) {
        ans++;
        return;
    }
    int l = x / m,r = x % m;
    if(l + 1 < n && vis[(l + 1) * m + r] == 0 && ch[(l + 1) * m + r] != '#') {
        vis[(l + 1) * m + r] = 1;
        dfs((l + 1) * m + r);
    }
    if(ans) return;
    if(r + 1 < m && vis[l * m + r + 1] == 0 && ch[l * m + r + 1] != '#') {
        vis[l * m + r + 1] = 1;
        dfs(l * m + r + 1);
    }
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i = 0 ; i < n ; i++)
        scanf("%s",ch + i * m);
    f = n * m - 1,ans = 0;
    vis[s] = 1,vis[f] = 0;
    dfs(s);
    if(ans == 0) {
        puts("0");
        return 0;
    }
    vis[s] = 1,vis[f] = 0;
    ans = 0;
    dfs(s);
    if(ans == 0) puts("1");
    else puts("2");
    //system(
    return 0;
}

おすすめ

転載: www.cnblogs.com/Repulser/p/11469851.html