题目描述:
给你一个题 让你搜索起点到终点有没有路径,只能上下左右走,且转弯数不超过2个
1 ≤ n, m ≤ 1000
解题思路:
明显是dfs题,但时间上过不去, 我们唯一可以解决的就是减少重复点的次数,分析可以知道当一个点重复出现且转弯数和方向都相等 那么该点完全重复可以省去,此时就已经能过了,只需要记录该点坐标,方向和转弯数(其实该点转弯数只要大于等于上次出现过的就一定不能走)
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e3+8;
int n,m,d,flag=0,cnt=0;
char map1[MAX][MAX];
int dira[5][2]={{1,0},{0,1},{-1,0},{0,-1}};
int vis[MAX][MAX][5][5];
void dfs(int x,int y,int d){
    if(cnt>=3) return ;
    if(flag==1) return ;
    if(map1[x][y]=='T') {flag=1;return ;}
    for(int i=0;i<4;i++){
        int x1=x+dira[i][0],y1=y+dira[i][1];
        if(x1<1||x1>n||y1<1||y1>m||vis[x1][y1][d][cnt]||map1[x1][y1]=='*')continue;
        if(d!=i&&d!=4) cnt++,vis[x1][y1][d][cnt]=1,dfs(x1,y1,i),cnt--;
        else vis[x1][y1][i][cnt]=1,dfs(x1,y1,i);
        if(flag) return ;
    }
}
int main(){
    int x=0,y=0;
    memset(vis,0,sizeof(vis));
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        getchar();
        for(int j=1;j<=m;j++){
            scanf("%c",&map1[i][j]);
            if(map1[i][j]=='S')x=i,y=j;
        }
    }
    vis[x][y][4][0]=1;
    dfs(x,y,4);
    if(flag)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}