题目:
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。
输入格式:
输入首先在第一行给出正整数K(≤10),即平局间隔的次数。随后每行给出对方的一次出招:ChuiZi
代表“锤子”、JianDao
代表“剪刀”、Bu
代表“布”。End
代表输入结束,这一行不要作为出招处理。
输出格式:
对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。
输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu
解答:
题目分析:
- 我们的输出稳赢不输
- 每隔k次要打平一次,即每k+1次里的第k+1次必须打平
- 输赢判断就是正常的石头剪刀布规则
操作实现:
- 定义string数组,存放三种招式,且后一个招式能赢前一个招式
- 定义cmp函数,返回一个招式,若flag为false则打平,若flag为true则取胜(找到招式a在s[]里的下标i,并返回s[(i+1)%3])
- 利用while循环进行输入,当输入End时退出循环
- 定义出招次数count,当count为k+1的倍数时表示已经赢了k次,目前这一次需要打平,每次循环之后都要进行count++
代码实现:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
string s[3] = {"ChuiZi", "Bu", "JianDao"};
string cmp(string a, bool flag);
int main()
{
int k; cin >> k;
string t; cin >> t;
int count = 1;
while(t != "End")
{
if(count % (k + 1) != 0) cout << cmp(t, true) << endl;
else cout << cmp(t, false) << endl;
count++;
cin >> t;
}
return 0;
}
string cmp(string a, bool flag)
{
if(!flag) return a;
int i = 0;
while(a != s[i]) i++;
return s[(i + 1) % 3];
}
PTA题目地址
欢迎大家探讨