头像

Cyan

四川成都

深度强化学习炼丹师

2019第十届蓝桥杯国赛-H解谜游戏

2019第十届蓝桥杯国赛-H解谜游戏

2021-07-03 · 27次阅读 · 原创 · 数据结构与算法

题面

【问题描述】

JieMiGame.png

小明正在玩一款解谜游戏。谜题由 24 根塑料棒组成,其中黄色塑料棒 4 根,红色 8 根,绿色 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。 初始时这些塑料棒排成三圈,如上图所示,外圈 12 根,中圈 8 根,内圈 4 根。

小明可以进行三种操作:

  1. 将三圈塑料棒都顺时针旋转一个单位。例如当前外圈从 0 点位置开始 顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那 么顺时针旋转一次之后,外圈、中圈、内圈依次变为:GYRYGRYGRGGG、 YRGRGGRR 和 RGGG。
  2. 将三圈塑料棒都逆时针旋转一个单位。例如当前外圈从 0 点位置开始 顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那 么逆时针旋转一次之后,外圈、中圈、内圈依次变为:RYGRYGRGGGGY、 GRGGRRYR 和 GGRG
  3. 将三圈 0 点位置的塑料棒做一个轮换。具体来说:外圈 0 点塑料棒 移动到内圈 0 点,内圈 0 点移动到中圈 0 点,中圈 0 点移动到外圈 0 点。 例如当前外圈从 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么轮换一次之后,外圈、中圈、内圈依次变 为:RRYGRYGRGGGG、GGRGGRRY 和 YGGR。

小明的目标是把所有绿色移动到外圈、所有红色移动中圈、所有黄色移动 到内圈。给定初始状态,请你判断小明是否可以达成目标?

【输入格式】

第一行包含一个整数 T,代表询问的组数。(1 ≤ T ≤ 100)。

每组询问包含 3 行:

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

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

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

【输出格式】

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

【样例输入】

2
GYGGGGGGGGGG
RGRRRRRR
YRYY
YGGGRRRRGGGY
YGGGRRRR
YGGG

【样例输出】

YES
NO

思路

找规律。内圈的周期为 T1 = 4,中圈周期为 T2 = 8,外圈周期为 T3 = 12,则可以知道,内圈的一根塑料棒,唯一的对应中圈的两根塑料棒和外圈的三根塑料棒(如下图,相同颜色圈起来的的位置可以相互交换)。

则无论怎么执行上述三种交换方式,圈起来的位置的塑料棒只能在同种颜色圈起来的位置进行交换,则只要同种颜色圈起来位置满足有一个黄色,两个红色和三个绿色的塑料棒即可以为一种合法方案。则直接枚举内圈的四个塑料板对应的中圈和外圈的组合。

myJieMi.png

代码

#include<iostream> #include<string> #include<map> using namespace std; int T; string a, b, c; bool solve() { for (int i = 0; i < 4; i++) { map<char, int> Map; //内圈 Map[a[i]]++; //中圈 Map[b[i]]++; Map[b[i + 4]]++; //外圈 Map[c[i]]++; Map[c[i + 4]]++; Map[c[i + 8]]++; if (Map['Y'] != 1 || Map['R'] != 2 || Map['G'] != 3) return false; } return true; } int main() { ios::sync_with_stdio(false); cin >> T; while (T--) { cin >> c >> b >> a; if (solve()) puts("YES"); else puts("NO"); } return 0; }

标题: 2019第十届蓝桥杯国赛-H解谜游戏
链接: https://www.fightingok.cn/detail/119
更新: 2022-09-18 22:40:30
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可