DFS
搜索。- 水管出水状态和进入状态相关,故需要记录上一个格子流入下一个格子时的状态。
- 分析状态可知:
- 对于
I
形的水管,流出状态和流入状态相同。 - 对于
L
形的水管,当流入状态是
↑
\uparrow
↑ 或
↓
\downarrow
↓ 时,流出时都有两种状态
←
\leftarrow
← 和
→
\rightarrow
→;当流入状态是
←
\leftarrow
← 或
→
\rightarrow
→ 时,流出时都有两种状态
↑
\uparrow
↑ 和
↓
\downarrow
↓ 。 - 根据上述分析,我们可以得到相应状态的偏移量,在搜索时通过加上该偏移量达到坐标的转移。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
char g[2][N];
bool st[2][N];
int m, x, y;
bool ok;
void dfs(int i, int j, int d) {
if (ok) return;
if (i == 2 && j == y - 1) {
ok = true;
return;
}
if (i < 0 || i >= 2 || j < 0 || j >= m || st[i][j]) return;
st[i][j] = true;
if (g[i][j] == 'I') {
if (d == 0) dfs(i + 1, j, 0);
if (d == 1) dfs(i, j + 1, 1);
if (d == 2) dfs(i - 1, j, 2);
if (d == 3) dfs(i, j - 1, 3);
} else {
if (d == 0)
{
dfs(i, j + 1, 1);
dfs(i, j - 1, 3);
}
if (d == 1)
{
dfs(i + 1, j, 0);
dfs(i - 1, j, 2);
}
if (d == 2)
{
dfs(i, j + 1, 1);
dfs(i, j - 1, 3);
}
if (d == 3)
{
dfs(i + 1, j, 0);
dfs(i - 1, j, 2);
}
}
st[i][j] = false;
}
bool solve() {
cin >> m >> x >> y;
for (int i = 0; i < 2; i++) cin >> g[i];
ok = false;
for (int i = 0; i < 2; i++)
for (int j = 0; j <= m; j++)
st[i][j] = false;
dfs(0, x - 1, 0);
return ok;
}
int main() {
int T;
cin >> T;
while (T--) {
if (solve()) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}