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 }