#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m;
cin >> n >> m; // 输入桥的长度和参与者数量
string glasses;
cin >> glasses; // 输入每次钢化玻璃的位置
int passed = 0; // 记录通过的参与者数量
// 第一个人从左边开始
bool is_left = true;
char last_glass = 'z'; // 初始位置
for (int i = 0; i < m; ++i) {
// 如果当前在左边玻璃且下一块是钢化玻璃,或者当前在右边玻璃且上一块是钢化玻璃,则通过
if ((is_left && glasses[i % n] == 'z' && last_glass == 'y') ||
(!is_left && glasses[(i + n - 1) % n] == 'y' && last_glass == 'z')) {
passed++;
}
// 更新上一块玻璃的位置
last_glass = is_left ? 'z' : 'y';
// 切换方向
is_left = !is_left;
}
cout << passed << endl; // 输出通过的参与者数量
return 0;
}
问题描述
在nana游戏中有一个过玻璃桥的游戏,它是由 2×n 块玻璃组成的玻璃桥,每一次左右两边都有一块钢化玻璃和一块普通玻璃组成,显然走到普通玻璃就会掉下去,掉下去的人需要写一千道编程的题目。现在有聪明的 m 个学生想要尽可能多的通过桥,所以在不确定跳哪个玻璃的情况下,他们采用左右左右的方法前行。
即在不确定跳哪个玻璃的情况下,如果你现在在左边玻璃,则下一次跳到右边玻璃;反之如果在右边玻璃则下一次跳左边玻璃,同时成员间信息共享,后面的人知道前面的人的情况。
第一名成员选择跳左边玻璃来开始游戏。现在你已知每一次的哪块是钢化玻璃,用 y 表示右边是钢化玻璃, z 表示左边是钢化玻璃,问能通过这关的玩家有多少人。
输入格式
第一行两个整数
n,m : 表示桥的长度为 n,有 m 个参赛玩家。
第二行 n 个字母表示每次钢化玻璃是哪块。
输出格式
输出可以到达终点的人数。
样例输入
输入数据 1
5 4
zyzyz
输出数据 1
4
样例解释
第一个人按照左右左右左的方式既可以通关了,后面的人知道第一个人怎么跳的,自然也会通关,所以答案是 4.