- 题意: (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;
}
- 答案只能取0~2
- 如果走不到终点,则不需要封点
- 第二次dfs时,不经过第一次走的点,可以走到终点,说明至少有两条不重合的路径可以到达终点,则必须封掉两个点.如果走不到终点,则说明两条到终点的路径最少有一点是重合的,把那一点封掉即可
- 由于题目给的是n*m的范围,需要将两维的坐标换算成一维的 (idx = y*m+x)