题目连接: Pipes
题目:
这次的题目有些复杂, 请点击题目连接后的 Pipes 查看原题, 在此就不多赘述了.
解题思路:
这个题最初用搜索做的, 代码特别长, 很多有很多的余缀. 但是后来发现其实都是一些特判
一共说是有6种管子, 但实际上只有两大类型, 一种直管, 一种弯管.
如果是直管, 那你只能到达当前行的下一个位置. 如果是弯管, 你只能到达下一行的下一个位置.
因此我们得出结论, 无论经过什么类型的管子, 一定都会向前走一格, 至于是否换行, 只需要看是否为弯管.
当我们遇到弯管需要换行时, 为了避免换行后仍有路可走, 我们应判断另一行的该位置是否同样为弯管接应水流, 如果是直管则下一步将被堵死, 无路可走.
假如我们在(1, 2)处, 此处为弯管, 我们通过此管到达(2, 3)处, 若此时(2,3)处为直管, 则只能竖着放置, 那下一步将流出图外, 是不可行的.(难理解可以画图帮助理解)
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
string a[2]; int n; //存图
void fact()
{
int h = 0; //默认位置在第一行.
for (int i = 0; i < n; i++) {
if (a[h][i] == '1' || a[h][i] == '2') continue; //如果当前行是直管 则什么也不做
/* 说明当前层是弯管 */
if (a[h ^ 1][i] >= '3' && a[h ^ 1][i] <= '6') h ^= 1; //如果另一行的i位置也是弯管, 则可通过 (^1含义见片尾)
else { cout << "NO" << endl; return; }
}
if (h == 1) cout << "YES" << endl;
else cout << "NO" << endl;
}
int main(void)
{
int t; cin >> t;
while (t--) {
cin >> n >> a[0] >> a[1];
fact();
}
return 0;
}
关于整数x^1:
如果x为奇数, 则 x^1 = x - 1;
如果x为偶数, 则 x^1 = x + 1;
即: 整数x^1的结果为 奇数-1 偶数+1;
因此我们可以通过把0异或1来得到1, 把1异或1来得到0