本题的核心是将灯带颜色变换建模为确定性有限状态自动机。
关键观察:
2^16 = 65536 种可能状态。小明设计了一条灯带,该灯带中共有 16 盏灯(编号 0 到 15),每盏灯有两种颜色:红色(用字符 R 表示)和绿色(用字符 G 表示)。每过一秒,灯带中的灯都会按照以下规则进行一次颜色变换:
lights[i] 的两个相邻灯 lights[i-1] 和 lights[i+1] 颜色一致,则灯 lights[i] 在当前秒需要设置为绿色。注意:灯带中编号为 0 的灯和编号为 15 的灯是不相邻的(线性灯带,首尾不相连)。因此编号 0 的灯只有右邻居 lights[1],编号 15 的灯只有左邻居 lights[14]。
给定一个灯带的初始状态,请你输出 t 秒后灯带中各灯的颜色。
请实现以下函数:
string lightStripTransform(string lights, int t);
参数说明:
lights:字符串,表示灯带中各灯的初始颜色,红色用字符 R 表示,绿色用字符 G 表示。字符串长度固定为 16。t:整数,表示需要获取灯带颜色的时刻(即经过 t 秒变换后的状态),取值范围 1 <= t <= 10000000。返回值:
16 的字符串,表示 t 秒后灯带中各灯的颜色,红色用 R 表示,绿色用 G 表示。单行输入,格式为:
"lights",t
其中 lights 为用英文双引号包围的长度为 16 的字符串,t 为整数。两者用逗号分隔。
输出一个用英文双引号包围的长度为 16 的字符串。
lights 长度固定为 16。lights 中每个字符为 'R' 或 'G'。1 <= t <= 10000000。输入
"RRRRRRRRRRRRRRRR",1
输出
"RGGGGGGGGGGGGGGR"
说明
初始状态全红。位置 1 到 14 的灯,由于左右邻居都是红色(一致),根据规则 1 变为绿色。位置 0 和位置 15 只有单一邻居,无法应用规则 1,根据规则 2 保持红色。
输入
"RRRRRRRRRRRRRRRR",2
输出
"RRGGGGGGGGGGGGRR"
说明
RGGGGGGGGGGGGGGR0:只有右邻居 G,单一邻居 → 红色1:左右邻居为 R 和 G,不一致 → 红色2 到 13:左右邻居都是 G,一致 → 绿色(形成中央绿色区域)14:左右邻居为 G 和 R,不一致 → 红色15:只有左邻居 G,单一邻居 → 红色输入
"RGGGRGGGRGGGRGGG",1
输出
"RRGRGRGRGRGRGRGR"
说明
对每个位置应用一次规则即可得到输出 RRGRGRGRGRGRGRGR。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.