测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40227. 解谜游戏

填空题 困难

题目描述

解谜游戏

题目描述

小明正在玩一款解谜游戏。

谜题由 24 根塑料棒组成,其中黄色塑料棒 4 根,红色 8 根,绿色 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。

初始时这些塑料棒排成三圈,如上图所示,外圈 12 根,中圈 8 根,内圈 4 根。

小明可以进行三种操作:

将三圈塑料棒都顺时针旋转一个单位。例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么顺时针旋转一次之后,外圈、中圈、内圈依次变为:GYRYGRYGRGGG、YRGRGGRR 和 RGGG。

将三圈塑料棒都逆时针旋转一个单位。例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么逆时针旋转一次之后,外圈、中圈、内圈依次变为:RYGRYGRGGGGY、GRGGRRYR 和 GGRG。

将三圈 0 点位置的塑料棒做一个轮换。具体来说:外圈 0 点塑料棒移动到内圈 0 点,内圈 0 点移动到中圈 0 点,中圈 0 点移动到外圈 0 点。例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么轮换一次之后,外圈、中圈、内圈依次变为:RRYGRYGRGGGG、GGRGGRRY 和 YGGR。

小明的目标是把所有绿色移动到外圈、所有红色移动中圈、所有黄色移动到内圈。

给定初始状态,请你判断小明是否可以达成目标?

输入格式

第一行包含一个整数 T,代表询问的组数。

每组询问包含 3 行:

第一行包含 12 个大写字母,代表外圈从 0 点位置开始顺时针每个塑料棒的颜色。

第二行包含 8 个大写字母,代表中圈从 0 点位置开始顺时针每个塑料棒的颜色。

第三行包含 4 个大写字母,代表内圈从 0 点位置开始顺时针每个塑料棒的颜色。

输出格式

对于每组询问,输出一行 YES 或者 NO,代表小明是否可以达成目标。

数据范围

1≤T≤100

输入样例:

2

GYGGGGGGGGGG

RGRRRRRR

YRYY

YGGGRRRRGGGY

YGGGRRRR

YGGG

输出样例:

YES

NO

参考答案

#include<bits/stdc++.h> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const double Pi = acos(-1); namespace { template <typename T> inline void read(T &x) { x = 0; T f = 1;char s = getchar(); for(; !isdigit(s); s = getchar()) if(s == '-') f = -1; for(; isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48); x *= f; } } #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define _for(n,m,i) for (register int i = (n); i < (m); ++i) #define _rep(n,m,i) for (register int i = (n); i <= (m); ++i) #define _srep(n,m,i)for (register int i = (n); i >= (m); i--) #define _sfor(n,m,i)for (register int i = (n); i > (m); i--) #define lson rt << 1, l, mid #define rson rt << 1 | 1, mid + 1, r #define lowbit(x) x & (-x) #define pii pair<int,int> #define fi first #define se second set<string> se; bool pd(string a, string b, string c) { return se.find(a+b+c) != se.end(); } void dfs(string s) { se.insert(s); swap(s[0], s[3]);swap(s[3], s[5]); if(se.find(s) == se.end()) dfs(s); swap(s[0], s[3]);swap(s[3], s[5]); if(se.find(s) == se.end()) dfs(s); swap(s[0], s[3]);swap(s[3], s[5]); swap(s[3], s[4]); swap(s[0], s[1]); swap(s[1], s[2]); if(se.find(s) == se.end()) dfs(s); } int main() { dfs("GGGRRY"); int t; read(t); string a, b, c, s; while(t--) { cin >> a >> b >> c; int f = 1; for(int i = 0; i <= 3; ++i) { s.clear(); if(!pd(a.substr(i, 1)+a.substr(i+4, 1)+a.substr(i+8, 1), b.substr(i,1) + b.substr(i+4, 1), c.substr(i,1))) { f = 0; } } if(f) puts("YES"); else puts("NO"); } }
上一题 下一题