题目链接
思路
因为一定只有两行,那么如果存在路径只会有一种可能。
而且题目只问了有没有可能,不需要关心转动管道的代价,所以1,2管道是同一类,3,4,5,6管道是同一类。
那我们直接手动模拟这个过程即可。并且在模拟的时候记住到达当前位置的方向,进行判断即可。
代码
#include<bits/stdc++.h>
using namespace std;
int LEFT = 1, TOP = 2, BOTTOM = 3;
int main() {
int n_test;
cin >> n_test;
while (n_test--) {
int n;
cin >> n;
vector<string> b(3);
for (int i = 1; i <= 2; ++i) {
cin >> b[i];
}
b[1] = "2" + b[1];
b[2] = " " + b[2];
int i = 1, j = 0;
int from = LEFT;
bool flag = false;
while (1 <= i && i <= 2 && j >= 0 && j <= n) {
// cout << i << " " << j << endl;
if (b[i][j] == '1' || b[i][j] == '2') {
++j;
if(from != LEFT) {
break;
}
from = LEFT;
} else {
// 3 4 5 6
if (i == 1) {
// go down
assert(from != TOP);
if (from == LEFT) {
++i;
from = TOP;
} else if (from == BOTTOM) {
++j;
from = LEFT;
}
} else {
assert(from != BOTTOM);
if (from == LEFT) {
--i;
from = BOTTOM;
} else if (from == TOP) {
++j;
from = LEFT;
}
}
}
if (i == 2 && j == n + 1) {
printf("YES\n");
flag = true;
break;
}
}
if (!flag)
printf("NO\n");
}
}