[CF1214D] Остров сокровищ

Описание лица вопросы

Все мы любим сокровище, не так ли? Вот почему молодой Вася идет на остров сокровищ.

Цзиньиньдао может быть представлена ​​в виде прямоугольной таблицы п × м, которая окружена океаном. Пусть нам номер строки поля с последовательными целыми числами от 1 до п от верхней до нижней и столбцов с последовательными целыми числами от 1 до м слева направо. Обозначим ячейку в г-й строки и с-го столбца в (г, с). Некоторые из островных клеток содержат непроходимые леса, а некоторые клетки свободны и проходимы. Сокровище спрятано в ячейке (п, т).

Вася сошел с корабля в клетке (1,1). Теперь он хочет, чтобы достичь сокровища. Он торопясь, так что он может двигаться только от клетки к клетке в следующей строке (вниз) или следующим колонке (вправо), то есть из клетки (х, у), он может двигаться только к клеткам (х + 1, у) и (х, у + 1). Конечно, Вася не может двигаться через клетку с непроходимыми лесами.

Злая колдунья знает о путешествии Васи, и она собирается помешать ему достичь сокровища. Перед первым ходом Васи она может расти, используя ее злые магические непроходимые леса в ранее свободных клеток. Ведьма способна вырастить лес в любом количестве любых свободных клеток, за исключением клеток (1,1), где Васька соскочил с кораблем и (п, т), где клад скрыт.

Помощь Злой колдуньи выяснив минимальное количество клеток, которые она не должна превращаться в непроходимый лес, так что Вася уже не в состоянии достичь сокровища.

Формат ввода

Первая строка ввода содержит два положительных целых чисел N, M (3≤n⋅m≤1000000), размеры острова.

После п строк содержит строки си длину т, описывающий остров, J-й символ строки равен си «#», если клетка (I, J) содержит непроходимый лес и «» если ячейка свободна и проходимы. Напомню, что Вася получает свой корабль в клетке (1,1), то есть в первой ячейке первой строки, и он хочет, чтобы добраться до клетки (п, т), то есть в последней ячейке последней строки.

Гарантируется, что клетки (1,1) и (п, т) являются пустыми.

Формат вывода

Выведите единственное число к, которое является минимальное количество клеток Злая колдунья должна превратиться в непролазные леса, чтобы предотвратить Васю от достижения сокровища.

Примеры данных

ввод пробы

2 2
..
..

Пример вывода

2

решение проблемы

Простой вопрос ......
В самом деле, с учетом максимального ответа является (1,2) и (2,1) подключены вместе, или (п-1, т) и (п, м-1) фаршированная, поэтому ответ на максимум 2.
Тогда рассмотрим шаги. Если вы просто определить , что сосед может достигнуть старта / финиша могут появиться следующие условия:

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

Затем мы находим две соседние узлы могут достигать начало и конец, и ответ 1, поэтому нам нужны другие решения.
Рассмотрим ли есть два пути. Мы сначала провести ДФС, если нет доступа непосредственно выхода к нулю. Если этот путь будет заблокирован проход, а вторая в глубине. Если ответ на второй ДФС имеет 2 выхода, в противном случае выход 1.
О корректности, из-за природы ДФСА не попало препятствий не будет менять направление (правило левой руки / правая рука правила) , чтобы двигаться, даже если есть два решения, мы также будем отдавать приоритет заткнуть не влияет на другой ответ путь может гарантировать правильность.

#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