题目描述:
给你一个题 让你搜索起点到终点有没有路径,只能上下左右走,且转弯数不超过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; }