时空幻境笔试
奇怪的灯控
某居住楼为了举办大型庆祝活动,购买了一批灯控设备,但是这批设备比较奇特,它有如下功能
一套设备能控制一个层楼中所有房间的灯的开关
如果把一个房间里的灯熄灭,这个房间后面房间的灯也会熄灭
如果把一个房间里的灯点亮,这个房间后面房间的灯也会点亮
假如 用0表示灯是熄灭状态,用1表示灯是点亮状态
某楼层的房间号是R1,R2,R3,R4,R5 它们的初始状态是 [0,0,0,0,0] 说明所有房间的都是熄灭的。
若我们用设备把第二个房间R2的灯点亮, 那么 房间R3,R4,R5的灯也会点亮 此时它们的状态变为 [0,1,1,1,1]
现在,我们要使用这个灯控系统用居民楼显示文字和图案。
假设初始状态所有房间的灯都是熄灭的。
现在给出某层楼里各个房间的灯的最后状态。请问最少操作多少次这个灯控设备,就能使这个楼层的灯变成最后的状态?
输入
一行,一个由“0”和“1”组成的字符串S,表示各个房间灯的最后状态
输入约束
字符串S中仅包含字符0或1,且字符个数(房间个数)范围是 [1,50]
输出
一行,一个整数,表示为了达到这个效果最少需要的操作次数
例子
输入
0011
输出
1
解释:
输入表示房间的最后状态是
R1 关
R2 关
R3 开
R4 开
在所有房间的灯都熄灭的情况下,只需要操作设备把R3房间的灯点亮 就能达到这种效果。所以结果是1,输出1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
// 0100001000101001 目标 // 0111111111111111 2开 // 0100000000000000 3灭 // 0100001111111111 7开 // 0100001000000000 8灭 // 0100001000111111 11开 // 0100001000100000 12灭 // 0100001000101111 13开 // 0100001000101000 14灭 // 0100001000101001 16开 //要达到目标图形,需要9次,发现规律:1旁边0的个数正是要操作的次数,首位是1时再+1次 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; public class Example { public static void Main() { string line = Console.ReadLine(); char[] bulbs = line.ToCharArray(); int operaSize=0; for (int i = 0; i < bulbs.Length; i++) { if (bulbs[i]=='1') { if (i==0) { operaSize++; } if ((i - 1) >= 0 && bulbs[i-1] == '0') { operaSize++; } if ((i + 1)<bulbs.Length && bulbs[i+1] == '0') { operaSize++; } } } Console.Write(operaSize); //有字都不行! //Console.Write("共操作"+operaSize+"次"); } } |
解救公主
最近阿宅迷上了一款二次元游戏叫<<解救公主>>。
其中有一关的规则是这样的
公主被困在梦境里,梦境里的空间无限大,公主靠自己是走不出来的。
系统会随机很多条行动指令,玩家必须帮公主选出正确的指令,公主按照玩家选择的指令,重复执行若干次后就能走出困境。
指令有三个字符组成 S,R,L
S: 前进一步
R: 向右转
L: 向左转
如果公主重复执行错误的指令,她就会一直在绕圈子,走不出梦境。
所谓“绕圈子”是指:无论公主重复执行多少次指令,她始终都在一个以出发点为圆心,以R为半径的圆里,永远走不出这个圆,更走不出梦境。
阿宅已经卡在这一关很久了。他很痛苦不能早日拯救公主脱离苦海,于是向聪明的你求助,让你写段代码判断哪些指令是正确的,哪些指令是错误的。
输入:
第一行 一个整数n
之后共有n行,每行为一个指令串
输入约束:
n位于区间[1,50]
从第二行开始,每行指令串长度为1-50,且仅包含字母 S,L,R
输出:
仅有一个单词。
指令串错误 打印 no
指令串正确 打印 yes
举例1:
输入
1
SLSR
输出
yes
解释:假设公主初始状态向北,公主的行动序列依次为前进,左转,前进,右转,此时公主仍然向北,但位置已经移动了。只要时间足够长,公主会一直向这个方向前进,所以公主没有在绕圈子。她能走出梦境,指令是正确的
举例2:
输入
2
SSSS
R
输出
no
解释: 公主一直在沿着一个边长为4步的小正方形绕圈子,指令是错误的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //思路,如果初始状态和结束状态 朝向相同,并且没有回到原来的位置的话,一直执行这条命令是可以出来的。 public class Example { static char n = 'S'; static int x = 0, y = 0; public static void Main() { string line = Console.ReadLine(); List<char> allMove = new List<char>(); for (int i = 0; i < int.Parse(line); i++) { string mline = Console.ReadLine(); allMove.AddRange(mline.ToCharArray()); } IsGoZero(allMove); Console.Write(n == 'S'&&(x != 0 || y != 0 ) ? "yes" : "no"); } public static void IsGoZero(List<char> allMove) { for (int i = 0; i < allMove.Count(); i++) { switch (allMove[i]) { case 'S': switch (n) { case 'S': y++; break; case 'X': y--; break; case 'Z': x--; break; case 'Y': x++; break; } break; case 'R': switch (n) { case 'S': n = 'Y'; break; case 'X': n = 'Z'; break; case 'Z': n = 'S'; break; case 'Y': n = 'X'; break; } break; case 'L': switch (n) { case 'S': n = 'Z'; break; case 'X': n = 'Y'; break; case 'Z': n = 'X'; break; case 'Y': n = 'S'; break; } break; } } } } |