第十届蓝桥杯b组C/C++决赛题目H解谜游戏
题目:
思路:通过题意可以知道,内圈转完4次(转完一圈),中圈转半圈,大圈转三分之一圈,那么可以知道,内圈零号位置对应中圈有两个位置,外圈有三个位置(即可以发生换圈位置的情况)。
比如:内圈的0号位对应的有中圈的0号和4号,还有外圈的0号、4号、8号
可以推出下图的关系:每个数字代表位置,下面的同颜色的横线表示同一组
可以分成四个组,只有在组内才能发生跨圈的操作,所以只要每个的条件都满足1个Y、2个R、3个G就可以达成目标输出YES。
C++的火候还不太够,所以用C语言写的代码
#include<stdio.h>
int main()
{
int data[26]={0};
char str1[5],str2[9],str3[13];//str1、2、2分别表示内圈中圈外圈
int t;
int flag=0;//flag用来记录最终的情况
scanf("%d",&t);
while(t--)
{
scanf("%s",str3);
scanf("%s",str2);
scanf("%s",str1);
for(int i=0;i<4;i++)
{
data[str1[(i+4)%4]-'A']+=1;//对内圈检查
data[str2[(i+4)%4]-'A']+=1;//对中圈检查
data[str2[(i+4)%8]-'A']+=1;
data[str3[(i+4)%4]-'A']+=1;//对外圈检查
data[str3[(i+4)%12]-'A']+=1;
data[str3[(i+4+4)%12]-'A']+=1;
if(data['R'-'A']==2&&data['G'-'A']==3&&data['Y'-'A']==1)
{
flag=1;
//把记录赋0,准备下组检查
data['R'-'A']=0;
data['G'-'A']=0;
data['Y'-'A']=0;
}
else
{
flag=0;//只要发现不能满足的情况就可以直接结束了,把flag赋值成0输出NO;
break;
}
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
第一次写,可能有点说不明白的,见谅。