题目链接
Problem Description
“石头、剪刀、布”是猜拳的一种,两人玩,起源于中国,然后传到日本、韩国等地,随着亚欧贸易的不断发展传到了欧洲,到了近现代逐渐发展到世界。
游戏规则中,石头克剪刀,剪刀克布,布克石头。
现在山东理工大学ACM集训队打算举行一场石头剪刀布锦标赛。比赛采取 100 局胜负制。
由于参赛选手过多,比赛决定采取初赛+决赛的方式决出最后的冠军。其中初赛每个人都要先和集训队开发的智能猜拳机器人阿尔法猫进行比赛,100局比赛中只要你获胜局数达到98局及以上即可获得胜利。
作为初代机器人,阿尔法猫的比赛策略是固定的。它的策略具体如下:
- 它会根据对方之前已经出过的石头次数、剪刀次数、布次数,来发出最不利于对方的操作。比如对方剪刀最多,它一定会出石头;对方布最多,它一定会出剪刀;对方石头最多,它一定会出布。
- 在比赛开始前,科学家blue长者会首先给它设定一个比赛策略,即给石头,剪刀,布各分配一个优先级,分别为 p,q,r。如果存在两个一样多,或三个一样多,或者一个都没出过(刚开局),那么它会优先选择优先级高的。比如说假如对方出过的剪刀和布一样多,石头比较少的话,那么它接下来的选择一定在石头和剪刀之间。如果石头的优先级为 3,剪刀的优先级为 2,那么它就会优先选择石头。
由于机器人只会依照既定策略进行操作也就是说,一旦你得到了机器人所执行的策略,也就是机器人在比赛中三种方式的优先级 p,q,r,那么这么100局比赛你肯定能全部获胜。(题目保证给出的三个优先级互不相同)
现在假定你足够聪明,请你编写程序战胜机器人进入猜拳决赛。
Input
有且仅有一行,三个整数 p,q,r 分别代表石头,剪刀和布的优先级,用空格隔开。
Output
首先输出一行,将刚输入的p,q,r再输出一遍,三个数之间用空格隔开。
接着输出 100 行,每行一个整数,依次为这 100 局你的选择。
石头输出 1,剪刀输出 2,布输出 3。
Sample Input
本题无样例输入
Sample Output
本题无样例输出
Hint
Source
改编
#include<bits/stdc++.h>
using namespace std;
int main(){
int p,q,r,psum,qsum,rsum,mx;
scanf("%d%d%d",&p,&q,&r);
printf("%d %d %d\n",p,q,r);
psum = 0,qsum = 0,rsum = 0;
for(int i = 0;i < 100;i++){
if(psum == qsum && psum == rsum){//如果出现相等,就按照优先级进行出拳
mx = max(p,max(q,r));
if(p == mx){//电脑出石头
cout << "3" << endl;//出布
rsum++;
}
else if(q == mx){//电脑出剪刀
cout << "1" << endl;//出石头
psum++;
}
else{//电脑出布
cout << "2" << endl;//出剪刀
qsum++;
}
}
else if(psum > qsum && psum > rsum){
//电脑判断我出的是石头,那么电脑出布,我要赢我就要出剪刀,比较绕,多思考!!
cout << "2" << endl;
qsum++;
}
else if(qsum > psum && qsum > rsum){
cout << "3" << endl;
rsum++;
}
else if(rsum > psum && rsum > qsum){
cout << "1" << endl;
psum++;
}
else if(psum == qsum && psum > rsum && qsum > rsum){
//如果出石头和剪刀的数量相等,电脑出布和石头
if(p > r){//如果电脑出石头,我出布
cout << "3" << endl;
rsum++;
}
else{//如果电脑出布,我出剪刀
cout << "2" << endl;
qsum++;
}
}
else if(psum == rsum && psum > qsum && rsum > qsum){
if(q > r){
cout << "1" << endl;
psum++;
}
else{
cout << "2" << endl;
qsum++;
}
}
else if(qsum == rsum && qsum > psum && rsum > psum){
if(p > q){
cout << "3" << endl;
rsum++;
}
else{
cout << "1" << endl;
psum++;
}
}
}
return 0;
}