其实是一道水题,很显然答案一定是0、1、2中的某一个数
那么直接上dfs搜一遍,标记走过的点,如果这一次dfs不能到达终点,那么答案为0
否则再dfs一遍,dfs时不走标记过的点,如果这一次不能到达终点,那么答案为1
否则答案为2
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 1000010 using namespace std; int n,m; char map[MAXN]; bool vis[MAXN]; bool dfs(int r,int c) { if(r<0||r>=n||c<0||c>=m||map[r*m+c]=='#'||vis[r*m+c]) return 0; if(r==n-1&&c==m-1) return 1; if(r!=0||c!=0) vis[r*m+c]=1; return dfs(r+1,c)||dfs(r,c+1); } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",map+i*m); if(!dfs(0,0)) {printf("0 ");return 0;} if(!dfs(0,0)) {printf("1 ");return 0;} printf("2 "); return 0; }