一道很有意思的搜索题,注意只有2,3两行有水管,那么我们只要分情况搜索就可以了。
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int m,x,y;
char s[5][N];
int vis[5][N];
//1表示上下流向,2表示左右流向
bool dfs(int a, int b, int dir){
if(a == 4 && b == y) return 1;
if(a > 3 || a < 2 || b > m || b < 1) return 0;
int flag = 0;
if(s[a][b] == 'I'){
if(dir == 1){
if(!vis[a+1][b]){
vis[a+1][b] = 1;
flag = flag | dfs(a+1, b, 1);
vis[a+1][b] = 0;
}
}
else{
if(!vis[a][b+1]){
vis[a][b+1] = 1;
flag = flag | dfs(a, b+1, 2);
vis[a][b+1] = 0;
}
if(!vis[a][b-1]){
vis[a][b-1] = 1;
flag = flag | dfs(a, b-1, 2);
vis[a][b-1] = 0;
}
}
}
else if(s[a][b] == 'L'){
if(dir == 1){
if(!vis[a][b+1]){
vis[a][b+1] = 1;
flag = flag | dfs(a, b+1, 2);
vis[a][b+1] = 0;
}
if(!vis[a][b-1]){
if(!vis[a][b-1]){
vis[a][b-1] = 1;
flag = flag | dfs(a, b-1, 2);
vis[a][b-1] = 0;
}
}
}
else{
if(!vis[a+1][b]){
vis[a+1][b] = 1;
flag = flag | dfs(a+1, b, 1);
vis[a+1][b] = 0;
}
if(!vis[a-1][b]){
vis[a-1][b] = 1;
flag = flag | dfs(a-1, b, 1);
vis[a-1][b] = 0;
}
}
}
return flag;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>m>>x>>y;
getchar();
for(int i=1; i<=m; i++){
s[2][i] = getchar();
}
getchar();
for(int i=1; i<=m; i++){
s[3][i] = getchar();
}
vis[2][x] = 1;
if(dfs(2, x, 1)) puts("YES");
else puts("NO");
vis[2][x] = 0;
}
return 0;
}