2555. 解谜游戏

题目链接

2555. 解谜游戏

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

image

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

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

小明可以进行三种操作:

将三圈塑料棒都顺时针旋转一个单位。例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么顺时针旋转一次之后,外圈、中圈、内圈依次变为:GYRYGRYGRGGGYRGRGGRRRGGG
将三圈塑料棒都逆时针旋转一个单位。例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么逆时针旋转一次之后,外圈、中圈、内圈依次变为:RYGRYGRGGGGYGRGGRRYRGGRG
将三圈 0 点位置的塑料棒做一个轮换。具体来说:外圈 0 点塑料棒移动到内圈 0 点,内圈 0 点移动到中圈 0 点,中圈 0 点移动到外圈 0 点。例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么轮换一次之后,外圈、中圈、内圈依次变为:RRYGRYGRGGGGGGRGGRRYYGGR
小明的目标是把所有绿色移动到外圈、所有红色移动中圈、所有黄色移动到内圈。

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

输入格式

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

每组询问包含 3 行:

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

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

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

输出格式

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

数据范围

1T100

输入样例:

2 GYGGGGGGGGGG RGRRRRRR YRYY YGGGRRRRGGGY YGGGRRRR YGGG

输出样例:

YES NO

解题思路

规律

为内、中和外圈分别编号为 0307011,则可以发现:可以整体上分为如下 4 快,且每一块之间互不影响:

0 0 0 0 4 4 0 0 8 ------ 1 1 1 1 5 5 1 1 9 ------ 2 2 2 2 6 6 2 2 10 ------ 3 3 3 3 7 7 3 3 11

现在目标是使每一块外圈有 3G,中圈有 2R,内圈有 1Y,因为每一块对应的影响的外、中和内圈的位置分别有 321
又由三圈之间的轮换关系,以第一块为例,可将三圈中的对应位置换成如下 9 种位置:

010203020301030102014243430142424301010283028301830102

GRY321
一个比较粗略的想法是:考虑外圈,外圈包含了所有的位置,可以先将 3G 全部移到外圈,然后在不影响外圈的基础上进一步操作,此时可以选择的操作有:

01020142

此时把仅剩的 1Y 移到内圈即可

  • 时间复杂度:O(T)

代码

// %%%Skyqwq #include <bits/stdc++.h> //#define int long long #define help {cin.tie(NULL); cout.tie(NULL);} #define pb push_back #define fi first #define se second #define mkp make_pair using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef pair<LL, LL> PLL; template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; } template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; } template <typename T> void inline read(T &x) { int f = 1; x = 0; char s = getchar(); while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); } while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar(); x *= f; } template <typename T> void print(T x) { if (x < 0) putchar('-'), x = -x; if (x < 10) putchar(x + 48); else print(x / 10), putchar(x % 10 + 48); } template <typename T> void print(T x, char t) { print(x); putchar(t); } int t; char s[3][105]; int main() { for(cin>>t;t;t--) { cin>>s[0]>>s[1]>>s[2]; bool f=true; for(int i=0;i<4;i++) { unordered_map<char,int> mp; for(int k=0;k<3;k++) for(int j=i;s[k][j];j+=4)mp[s[k][j]]++; if(!(mp['Y']==1&&mp['R']==2&&mp['G']==3)) { f=false; break; } } puts(f?"YES":"NO"); } return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/16105828.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示