PAT 520 钻石争霸赛:7-6 随机输一次 (20分) C++ & Python

题目描述

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
示意图
现要求你编写一个控制赢面的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方意识到你在控制结果,你需要隔 K K 次输一次,其中 K K 是系统设定的随机数。

输入格式

输入首先在第一行给出正整数 N N 10 \le10 ),随后给出 N N 个系统产生的不超过 10 的正随机数 { K 1 , K 2 , , K N K​_{1}​​,K_{2},⋯,K_{N} ​​ },数字间以空格分隔。这意味着第 i i i = 0 , 1 , , N 1 i=0,1,⋯,N−1 )次输局之后应该隔 K i + 1 K_{​i+1} ​​ 次再让下一个输局。如果对方出招太多,则随机数按顺序循环使用。例如在样例中,系统产生了 3 个随机数 {2, 4, 1},则你需要:赢 2 次,输 1 次;赢 4 次,输 1 次;赢 1 次,输 1 次;然后再次回到第 1 个随机数,赢 2 次,输 1 次。

之后每行给出对方的一次出招:“ChuiZi”代表“锤子”、“JianDao”代表“剪刀”、“Bu”代表“布”。“End”代表输入结束,这一行不要作为出招处理。输入保证对方至少出了一招。

输出格式

对每一个输入的出招,按要求输出赢或输局的招式。每招占一行。

输入样例

3 2 4 1
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
End

输出样例

Bu
ChuiZi
ChuiZi
ChuiZi
JianDao
Bu
Bu
JianDao
ChuiZi
ChuiZi
ChuiZi
JianDao
JianDao

程序代码

Python

n,*rand=map(int,input().split())     # 输入 n,以及随机数序列
ying={'ChuiZi': 'Bu', 'JianDao': 'ChuiZi', 'Bu': 'JianDao'}
shu={'Bu': 'ChuiZi', 'ChuiZi': 'JianDao', 'JianDao': 'Bu'}
i=0
fg=0
while True:
    # 赢若干次
    # 如果对方出招太多,则随机数按顺序循环使用,所以是 rand[i%n]
    for j in range(rand[i%n]):
        x=input()
        if x=="End":
            fg=1     # "End"代表输入结束,设置标志并退出循环
            break
        print(ying[x])     # 输出对应赢的招数,也可以用多个 if 直接判断输出那个
    
    if(fg):
        break
    
    # 输一次
    x=input()
    if x=="End":
        break
    print(shu[x])

    i+=1     # 换下一组随机数

注:上面的代码中,随机数序列 randlist 类型。关于 *rand 这一用法的解释,请参考:Python3 序列解包。有关 * 的更多用法,可以阅读:Python3 * 和 ** 运算符

C++

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<int> v;
	for(int i = 0; i < n; i++)
	{
		int a;
		cin >> a;
		v.push_back(a);
	}
	map<string, string> ying = {   // 三种手势对应赢的招数
		{"ChuiZi", "Bu"},
		{"JianDao", "ChuiZi"},
		{"Bu", "JianDao"}
	},
		shu = {   // 三种手势对应输的招数
		{"Bu", "ChuiZi"},
		{"ChuiZi", "JianDao"},
		{"JianDao", "Bu"}
	};
	int current = 0, end = 0;
	while(1)
	{
		// 赢若干次
		// 如果对方出招太多,则随机数按顺序循环使用,所以是 v[current % n]
		for(int j = 0; j < v[current % n]; j++)
		{
			string x;
			cin >> x;
			if(x == "End")
			{
				end = 1;   // "End"代表输入结束,设置标志并退出循环
				break;
			}
			puts(ying[x].c_str());   // 输出对应赢的招数,也可以用多个 if / switch 直接判断输出那个
		}
		if(end) break;

		// 输一次
		string x;
		cin >> x;
		if(x == "End")
		{
			break;
		}
		puts(shu[x].c_str());

		current++;   // 换下一组随机数
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/hyp19991114/article/details/106248208