1215:迷宫

迷宫

因为不需要找最优路径,只需要得到结果即可(YES/NO),所以走过的位置不需要还原

显然,使用这种方式大大减少了运行时间(降低了时间复杂度)。

下面验证其合理性:

  • 每一点只要可走就可以重复走、来回走(当然程序内部肯定不这样做),换言之,任何相交路径中的任意两点都是相通的。
  • 到达任一点可能有多条路径,但只要有一条路径可达,其他路径是否可达就无关紧要了。

剩下的就是深度搜索临界返回(得到结果)自然返回(无结果)

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int N=105;
 6 int n,x2,y2,a[N][N],che[8];
 7 bool check(int x,int y){
 8     if(x>=0&&x<n&&y>=0&&y<n&&!a[x][y])
 9         return 1;
10     return 0; 
11 }
12 bool solve(int x,int y){
13     if(x==x2&&y==y2)return 1;
14     a[x][y]=1;
15     for(int i=0;i<4;i++){
16         if(check(x+che[i],y+che[i+4]))
17             if(solve(x+che[i],y+che[i+4]))return 1;
18     }
19     return 0;
20 }
21 int main(){
22     int k,x1,y1;
23     char c;
24     che[0]=-1,che[1]=1,che[6]=-1,che[7]=1;
25     cin>>k;
26     while(k--){
27         memset(a,0,sizeof(a));
28         cin>>n;
29         for(int i=0;i<n;i++)
30             for(int j=0;j<n;j++){
31                 cin>>c;
32                 if(c=='#')a[i][j]=-1;
33             }        
34         cin>>x1>>y1>>x2>>y2;
35         if(!a[x1][y1]&&!a[x2][y2]&&solve(x1,y1))
36             cout<<"YES\n";
37         else cout<<"NO\n";
38     }
39     return 0;
40 }

 

posted @ 2021-08-05 20:32  Rekord  阅读(721)  评论(0编辑  收藏  举报