题意:
给出一个矩阵,从左上角走到右下角,只能向右和向下走,问你能否堵住某些点,使得走不到右下角。
题解:
答案小于等于2,即可以堵住从起点的下方和右方
这题如果理解的深搜的原理,就好做了,当然解法还有很多
第一遍bfs,如果到达不了右下角 输出0
第二遍bfs, 在第一遍dfs的时候已经标记了第一遍dfs的地方,如果第二遍还是能到达右下角,说明存在俩条不相交的路都可以到达右下角,如果到达不了右下角那么输出 1
否则 输出2
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1e6+10; string s[maxn]; int flag[maxn]; int n,m; bool dfs(int x,int y) { if(x < 0 || x >= n || y < 0 || y >= m || s[x][y] == '#' || flag[x*m+y]) return 0; if(x == n-1 && y == m-1) return 1; if(x || y) flag[x*m+y] = 1; return dfs(x+1,y)||dfs(x,y+1); } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) cin>>s[i]; if(!dfs(0,0)) { printf("0\n"); return 0; } if(!dfs(0,0)){ printf("1\n"); return 0; } printf("2\n"); return 0; }