解謎遊戲——第十屆藍橋杯b組c++決賽題目H

2020-11-13 23:00:03

題目描述

在這裡插入圖片描述
小明正在玩一款解謎遊戲,謎題由 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

分析

經過觀察,每一次旋轉只能三個圈一起旋轉,但是邊長不同,內圈四次一週,中圈八次一週,外圈十二次一週。
設初始時的棒號為內圈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;
}