代码实现:最开始想的是 起点先dfs跑一边 得到可以达到的点 然后在这些点里面继续跑dfs判断是否可以到达终点就行 爆肝1小时 可是只能拿到80分
又想到完全没有必要直接正向跑一边dfs然后反向跑一遍 容斥判定一下就行 100分
80分代码
//#includeconst int MAX=55; char a[MAX][MAX]; int b[MAX][MAX]; int c[MAX][MAX]; int vis[MAX][MAX]; int vis1[MAX][MAX]; int sx,sy; int ex,ey; int n,m; int xd1[2]={1,-1}; int yd1[2]={0,0}; int xd2[2]={0,0}; int yd2[2]={1,-1}; struct node{ int x,y; }; void dfs(int x,int y,int o){ queue qu; qu.push({x,y}); while (!qu.empty()) { node now=qu.front(); qu.pop(); int x1=now.x; int y1=now.y; char p; p=a[x1][y1]; vis[x1][y1]=1; if(p=='+'||p=='S'||p=='T'){ for(int i=0;i<4;i++){ int x2=x1+xd[i]; int y2=y1+yd[i]; p=a[x2][y2]; if(x2<1||x2>n||y2<1||y2>m||p=='#'||vis[x2][y2]) continue; // cout< n||y2<1||y2>m||p=='#'||vis[x2][y2]) continue; // cout<<"-"< n||y2<1||y2>m||p=='#'||vis[x2][y2]) continue; // cout< n||y2<1||y2>m||p=='#'||vis[x2][y2]) continue; // cout< qu; qu.push({x,y}); while (!qu.empty()) { node now=qu.front(); qu.pop(); int x1=now.x; int y1=now.y; char p; p=a[x1][y1]; vis1[x1][y1]=1; if(p=='+'||p=='S'||p=='T'){ for(int i=0;i<4;i++){ int x2=x1+xd[i]; int y2=y1+yd[i]; p=a[x2][y2]; if(x2<1||x2>n||y2<1||y2>m||p=='#'||vis1[x2][y2]) continue; // cout< n||y2<1||y2>m||p=='#'||vis1[x2][y2]) continue; // cout<<"-"< n||y2<1||y2>m||p=='#'||vis1[x2][y2]) continue; // cout< n||y2<1||y2>m||p=='#'||vis1[x2][y2]) continue; // cout< >n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='S'){ sx=i; sy=j; } if(a[i][j]=='T'){ ex=i; ey=j; } } } // cout< //#includeconst int N = 55; int n, m; char g[N][N]; int st1[N][N], st2[N][N]; //起点是否能到,能否能到终点 int dx[] = {-1, 0 ,1, 0}; int dy[] = {0, 1, 0, -1}; int check(int x, int y, int d) //(x,y) 能否朝 d 走 { char c = g[x][y]; if(c == 'S' || c=='T' || c=='+') return 1; if(c == '|' && d%2==0) return 1; if(c == '-' && d%2==1) return 1; if(c == '.' && d==2) return 1; return 0; } void dfs1(int x, int y) { if(st1[x][y]) return ; st1[x][y] = 1; for(int i=0; i<4; i++) { int a = x+dx[i], b = y+dy[i]; if(a<0 || a>=n || b<0 || b>=m || g[a][b]=='#') continue; if(check(x, y, i)) dfs1(a, b); } } void dfs2(int x, int y) { if(st2[x][y]) return ; st2[x][y] = 1; for(int i=0; i<4; i++) { int a = x+dx[i], b = y+dy[i]; if(a<0 || a>=n || b<0 || b>=m || g[a][b]=='#') continue; if(check(a, b, i^2)) dfs2(a, b); } } int main() { cin >> n >> m; for(int i=0; i > g[i]; } int xe, ye; for(int i=0; i



