Pipes(内含^1的妙用)

题目连接: 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

END

发布了20 篇原创文章 · 获赞 0 · 访问量 514

猜你喜欢

转载自blog.csdn.net/weixin_45799835/article/details/104287616
今日推荐