[CF1214D]トレジャーアイランド

説明フェイス質問

私たちの愛の宝物のすべて、右?若いVasyaはトレジャーアイランドに向かっている理由です。

トレジャーアイランドは、海に囲まれて、M×長方形のテーブルNとして表すことができます。左から右に私たちに1からmまでの連続する整数と連続で上から下へ、1からnまでの整数と列フィールドの数の行をしてみましょう。(R、C)のようにR行目のセルと、c番目の列を表します。島細胞の一部が通行不能の森林が含まれている、といくつかの細胞は無料とまずまずです。宝物は、セル(N、M)の中に隠されています。

Vasyaは、セル(1,1)で船を降りました。今、彼は宝物に到達したいと考えています。彼はアップ急いているので、彼は、セル(X + 1、Y)とにのみ移動することができる、すなわち細胞(X、Y)から、次の行(下向き)または(右)次の列のセルにセルからのみ移動することができます(X、Y + 1)。もちろんVasyaは通行不能森と細胞内を移動することはできません。

邪悪な魔女はVasyaの旅を認識しており、彼女は宝物に達することから、彼を防ぐために起こっています。Vasyaの最初の動きの前に、彼女は以前に自由な細胞では、彼女の邪悪な魔法通行不能の森林を利用して成長することができます。魔女はVasyaは宝が隠されている彼の船と(N、M)を降りた細胞(1,1)を除く任意のフリーセルの任意の数の森を育てることが可能です。

Vasyaはもはや宝物に到達することができるように、彼女は通行不能森に変身していない細胞の最小数を見つけることによって邪悪な魔女を助けます。

入力形式

入力の最初の行は2つの正の整数N、M(3≤n⋅m≤1000000)、島の大きさを含んでいます。

セル(i、j)は通行不能森とが含まれている場合、n行以下の島を記述した長さmの文字列のSIが含まれている、文字列のSIのj番目の文字が「#」に等しいです「」セルは無料で、通行可能である場合。私たちは、最後の行の最後のセル、すなわち、(n、m)はVasyaは、最初の行の最初のセル、すなわちセル(1,1)で彼の船を取得し、彼は、細胞に到達するために望んでいることを思い出してみましょう。

セル(1,1)と(N、M)が空であることを、保証です。

出力フォーマット

悪魔女は宝に到達するVasyaを防止するために、通行フォレストに入れなければならないセルの最小数のみ整数kを印刷。

サンプルデータ

サンプル入力

2 2
..
..

サンプル出力

2

問題の解決策

簡単な質問は、......
実際には、最大回答を考慮すると、(1,2)及び(2,1)が一緒に差し込まれ、又はある(N-1、M)及び(N、M-1)と詰め、2の最大の答えそう。
その後、移動を検討してください。あなたは、単にネイバーがスタート/フィニッシュラインに到達することができると判断した場合は、以下の条件を表示されることがあります。

input:
. . . . . # .
. . . . . # .
. . . . . # .
. . . . . . .
# # # # # # .
. . . . . . .

その後、我々は、開始と終了に達することができる2つの隣接ノードを見つけ、その答えは1であるので、我々は他のソリューションを必要としています。
2つのパスがあるかどうかを考えてみましょう。ゼロへの直接出力するアクセスがない場合我々はまず、DFSを行っています。このパスは、通路、及び第二のDFSをブロックする場合。二DFSへの答えは、2出力、それ以外の場合は出力1を持っている場合。
自然のDFSの移動する方向を変更することはありません(左手の法則/右手の法則)を障害物にヒットされていないため正確性については、2つの解がある場合でも、我々はまた、別の答えに影響を与えていないプラグインを優先させて頂きますパスが正しい保証することができます。

#include<bits/stdc++.h>
#define int long long
#define maxn 1000
using namespace std;
inline char get(){
    static char buf[30000],*p1=buf,*p2=buf;
    return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    register char c=getchar();register int f=1,_=0;
    while(c>'9' || c<'0')f=(c=='-')?-1:1,c=getchar();
    while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=getchar();
    return _*f;
}
int n,m;
set<pair<int,int> > mp,vis;
int dfs(int x,int y){
    //cout<<x<<" "<<y<<endl;
    if(x==n && y==m)return 1;
    if(vis.count(make_pair(x,y)))return 0;
    if(mp.count(make_pair(x,y)))return 0;
    if(x>n || y>m)return 0;
    vis.insert(make_pair(x,y));
    if(dfs(x+1,y)==1){
        mp.insert(make_pair(x+1,y));
        return 1;
    }
    if(dfs(x,y+1)==1){
        mp.insert(make_pair(x,y+1));
        return 1;
    }
    return 0;
}
signed main(){
    //freopen("1.txt","r",stdin);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(register int i=1;i<=n;i++){
        char cas;
        for(register int j=1;j<=m;j++){
            cin>>cas;
            if(cas=='#')mp.insert(make_pair(i,j));
        }
    }
    if(dfs(1,1)==0){
        cout<<0;
        return 0;
    }
    vis.clear();
    if(dfs(1,1)==0){
        cout<<1;
        return 0;
    }
    else{
        cout<<2;
        return 0;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/Chen574118090/p/11620702.html