题目描述
小明正在玩一款解谜游戏,谜题由 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,代表询问的组数。(1 ≤ T ≤ 100)。
每组询问包含 3 行:
第一行包含 12 个大写字母,代表外圈从 0 点位置开始顺时针每个塑料棒的颜色。
第二行包含 8 个大写字母,代表中圈从 0 点位置开始顺时针每个塑料棒的颜色。
第三行包含 4 个大写字母,代表内圈从 0 点位置开始顺时针每个塑料棒的颜色。
输出格式
对于每组询问,输出一行 YES 或者 NO,代表小明是否可以达成目标。
样例输入
2
GYGGGGGGGGGG
RGRRRRRR
YRYY
YGGGRRRRGGGY
YGGGRRRR
YGGG
样例输出
YES
NO
分析
经过观察,每一次旋转只能三个圈一起旋转,但是边长不同,内圈四次一周,中圈八次一周,外圈十二次一周。
设初始时的棒号为内圈0-3,中圈0-7,外圈0-11。
假设内圈的0号棒转动顺时针一周(即整体顺时针转动4次)再次回到0号位置,中圈则是原来的4号棒到了0号位置;外圈则是原来的8号棒到了0号位置。整体再顺时针转动一周的话,内圈的0号位置还是初始时的0号棒,中圈也还是初始的0号棒,外圈则是4号棒;
上述依次类推,会发现内圈的每一根棒无论整体怎么转动都是跟着中圈的两根棒和外圈的三根棒的。
即内圈每一根棒都是跟中圈的两根还有外圈的三根是绑定的。
上图为例,图中蓝色框中的是绑定一起的。
同理可将整体分为四块,只需判断每块中的颜色是否能够满足即可。
代码
#include<bits/stdc++.h>
using namespace std;
int t;
string s1,s2,s3;
int main(){
//freopen("a.txt","r",stdin);
cin>>t;
while(t--){
int flag = 0;
cin>>s3>>s2>>s1;
for(int i = 0;i<4;i++){
map<char ,int>mp;
//内圈
mp[ s1[i] ] += 1;
//中圈
mp[ s2[i] ] += 1;
mp[ s2[ i+ 4]] += 1;
//外圈
mp[ s3[i] ] += 1;
mp[ s3[ i+4]] += 1;
mp[ s3[i+8]] += 1;
if(mp['Y'] != 1 || mp['R'] != 2 || mp['G'] != 3){
flag = 1;
break;
}
}
if(flag == 0)
cout<<"YES"<<endl;
else{
cout<<"NO"<<endl;
}
}
return 0;
}