剪子-包袱-锤
Time Limit: 1000 ms Memory Limit: 65536 KiB
Special Judge
Submit Statistic
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<algorithm>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
int s,j,b,ssum=0,jsum=0,bsum=0,i,mx;
scanf("%d %d %d",&s,&j,&b);
printf("%d %d %d\n",s,j,b);
for(i=0; i<100; i++)
{
if(ssum==jsum&&jsum==bsum)//机器人根据三种情况相同时判断,根据优先级进行判断
//是机器人进行选择,然后我再根据规则判断输出
{
mx=max(s,max(j,b));
if(mx==s)
{
printf("3\n");
//sum++;
bsum++;
}
else if(mx==j)
{
printf("1\n");
//sum++;
ssum++;
}
else if(mx==b)
{
printf("2\n");
//sum++;
jsum++;
}
}
else if(ssum>jsum&&ssum>bsum)//机器人如果发现我的是石头最多,
//就会输出布,然后我输出剪刀
{
printf("2\n");
//sum++;
jsum++;
}
else if(jsum>ssum&&jsum>bsum)//机器人如果发现我的是剪刀最多,
//就会输出石头,然后我输出布
{
printf("3\n");
//sum++;
bsum++;
}
else if(bsum>ssum&&bsum>jsum)//机器人如果发现我的是布最多,
//就会输出剪刀,然后我输出石头
{
printf("1\n");
//sum++;
ssum++;
}
else if(ssum==jsum&&ssum>bsum&&jsum>bsum)//如果机器人发现我的石头和剪刀
//一样多,就会输出布和石头,然后再根据布和石头的优先级进行判断输出,我再根据
//机器人出的响应的进行改变
{
if(b>s)//布的优先级大的话,机器人会出布,那我就出剪刀
{
printf("2\n");
//sum++;
jsum++;
}
else
{
printf("3\n");//相反,如果出石头,我就出布
//sum++;
bsum++;
}
}
else if(ssum==bsum&&ssum>jsum&&bsum>jsum)//如果机器人发现我的石头和布
//一样多,就会输出布和剪刀,然后再根据布和剪刀的优先级进行判断输出,我再根据
//机器人出的响应的进行改变
{
if(b>j)
{
printf("2\n");
//sum++;
jsum++;
}
else
{
printf("1\n");
//sum++;
ssum++;
}
}
else if(bsum==jsum&&bsum>ssum&&jsum>ssum)
{
if(j>s)
{
printf("1\n");
//sum++;
ssum++;
}
else
{
printf("3\n");
// sum++;
bsum++;
}
}
}
//printf("%d\n",sum);
return 0;
}
think:机器人根据我出的情况进行统计,决定他出什么,然后我再根据机器人出的情况决定我出什么,当机器人进行判断的时候有7种情况,当我出石头,剪刀,布时他出什么(3),当我的石头,剪刀,布两两配对次数相同时他会根据优先级进行判断自己出什么,然后我再根据他出的判断我出什么(3),当石头,剪刀,布次数相同的时候,根据优先级判断自己出什么,然后我进行判断自己出什么(1)。
总体思路:机器人根据我的出拳的情况进行统计,然后我再根据机器人的情况进行输出,再根据题意优先级进行分类判断