首页 > 其他分享 >【洛谷 P8700】[蓝桥杯 2019 国 B] 解谜游戏 题解(字符串+映射+周期性)

【洛谷 P8700】[蓝桥杯 2019 国 B] 解谜游戏 题解(字符串+映射+周期性)

时间:2024-04-03 13:31:10浏览次数:30  
标签:12 内圈 塑料 题解 中圈 蓝桥 外圈 int 解谜

[蓝桥杯 2019 国 B] 解谜游戏

题目背景

题目描述

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

小明可以进行三种操作:

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

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

输入格式

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

每组询问包含 3 3 3 行:

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

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

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

输出格式

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

样例 #1

样例输入 #1

2
GYGGGGGGGGGG
RGRRRRRR
YRYY
YGGGRRRRGGGY
YGGGRRRR
YGGG

样例输出 #1

YES
NO

提示

蓝桥杯 2019 年国赛 B 组 H 题。


思路

每个圈中每4个元素为1个周期。其中,外圈有3个周期,中圈有2个周期,内圈有1个周期。每个周期内的元素可以分为四组,每个周期中相同位置的塑料棒被认为是一组。无论旋转多少次,塑料棒的位置总是在组内循环。

图中数字代表组号,数字相同的元素可以调换位置。

Inner Middle Outer 2 1 3 4 2 1 3 4 1 2 3 4 2 1 3 4 1 2 3 4 1 2 3 4

首先,定义一个长度为4的map数组,存储每组中每个颜色的塑料棒的数量。

然后,读入外圈、中圈和内圈的塑料棒的颜色,并根据塑料棒的位置和颜色进行分组统计,每个周期中相同位置(i % 4)的塑料棒被认为是一组。

接着,检查每组中的塑料棒颜色数量是否满足目标状态:每组应有3个绿色,2个红色,1个黄色。如果所有组都满足,那么输出"YES",否则输出"NO"。


AC代码

#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

int n;

void solve() {
	map<char, int> cnt[4];
	for (int i = 0; i < 4; i++) {
        // 初始化
		cnt[i]['G'] = 0;
		cnt[i]['Y'] = 0;
		cnt[i]['R'] = 0;
	}
	string str[3];
	for (int i = 2; i >= 0; i--) {
		cin >> str[i];
	}
	for (int j = 0; j < 3; j++) {
		for (int i = 0; i < (j + 1) * 4; i++) {
			// cout << i << " " << i % 8 << " " << i % 4 << endl;
			// 统计每组中某颜色的数量
			cnt[i % 4][str[j][i]]++;
		}
	}
	bool ans = 1;
	for (int i = 0; i < 4; i++) {
        // 每组应有3绿2红1黄
		ans &= (cnt[i]['G'] == 3);
		ans &= (cnt[i]['R'] == 2);
		ans &= (cnt[i]['Y'] == 1);
	}
	cout << (ans ? "YES" : "NO") << "\n";
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	while (n--) {
		solve();
	}
	return 0;
}

标签:12,内圈,塑料,题解,中圈,蓝桥,外圈,int,解谜
From: https://blog.csdn.net/qq_34988204/article/details/137199047

相关文章

  • 记录一次解决跨域问题解决过程。 strict-origin-when-cross-origin,net::ERR_FAILED, No
    事情是这样的,vue项目本地启动可以正常连接后端端口访问,部署到nginx上只有就无法访问,显示跨域问题  于是查看后端日志 啥都没有,觉得肯定是nginx的问题,怎么配置都没用, location/{ roothtml; indexindex.htmlindex.htm; add_header'Access-Control-Allow-O......
  • P3622 [APIO2007] 动物园 -题解
    好写爱写没事干所以有了这篇题解洛谷P3622[APIO2007]动物园题解$Link$hzoi题库洛谷题目说的挺繁琐,其实就传达了一个很简单的信息:\(n\)个动物,\(c\)个小孩,每个小孩能看到\(5\)个动物(所在的位置)\(E\)到\(E+4\),有\(F\)个害怕的动物,\(L\)个喜欢的动物。如果视野中有至......
  • 题解:P3903 导弹拦截III
    第一步:确定子任务因为当前拦截的导弹可能在奇数位上,也可能在偶数位上,所以以这两种状态为子任务。第二步:确定状态设$dp[i][0/1]$为作为第(偶数/奇数)个被拦截的导弹,最大可以拦截多少个导弹第三步:推出转移方程$dp[i][0]=max(dp[j][1])+1(1\lej<i且h[i]<h[j])$$dp[i][1]=max(......
  • P8776 [蓝桥杯 2022 省 A] 最长不下降子序列
    1.首先想到的做法设up_len[i]为以a[i]为结尾的最长不下降子序列的长度,down_len[i]表示以a[i]为开始的最长不下降子序列的长度。在求pre的过程中记录下额外信息:down_pre[i]表示在求down_len[i]的过程中,i是由哪个点转移过来的;得到dp的转移方程:if(down_pre[i])ans......
  • 题解:P2758 编辑距离
    第一步:确定子问题有4种操作(删除,添加,修改,不变)。所以4个子问题就是操作后的A变为B需要多少步。第二步:确定状态设$dp[i][j]$为将A的前i位变为B的前j位的最小代价。第三步:确定转移方程删除:$dp[i][j]=dp[i-1][j]+1$添加:$dp[i][j]=dp[i][j-1]+1$修改:$dp[i][j]=dp[i-1][j......
  • 蓝桥杯单片机组第十四届省赛
     1.题目 本次题目模块较多,难度较大  2.底层代码2.1三个常用模块2.1.1按键本次省赛采用了NE555模块,要用P34引脚,在按键底层中,要把P34相关的代码注释掉,并且要将P34引脚用跳线帽(可以用超声波模块的跳线帽)与SIGNAL相连Key.c#include<Key.h>unsignedchar......
  • 蓝桥杯单片机第十三届省赛
    一、题目这次的省赛我感觉还是比较基础的,掌握几个模块就可以完全写出题目是在在网上找的二、代码 main.c#include<STC15F2K60S2.H>#include<ds1302.h>#include<onewire.h>#include<intrins.h>#include<Init.h>#include<Key.h>#include<Seg.h>#include......
  • 蓝桥杯算法集训 - Week 5:树状数组、各类DP算法
    蓝桥杯算法集训-Week5本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、树状数组树状数组是一种数据结构,可以快速地完成以下两个操作:将第i个数加上c快速求前缀和,即任意区间[i,j]的和Ⅰ、代码模板//树状数组长度......
  • AGC066 题解
    题解:AT_agc066_a[AGC066A]AdjacentDifference笑点解析:没有必要将总成本最小化。我们将格子间隔的黑白染色(显然有两种染色方法),对于黑点我们要求它是奇数倍\(d\),对于白点我们要求它是偶数倍\(d\),这样一定满足相邻格子相差至少\(d\)。因为两种染色方法的代价和为\(dN^2\),......
  • [ABC259F] Select Edges 题解
    很容易想到树形dp。考虑在有根树内,每个点都有两种状态:不选自己和父亲的边;要选自己和父亲的边。那么单独对于子树内部而言,就要分两种情况:最多可以向\(d_i\)个孩子连边,对应上述第一种情况,我们称之为\(f_i\);最多可以向\(d_i-1\)个孩子连边,对应上述第二种情况,我们称之......