现在的位置: 首页 > 综合 > 正文

石头-剪刀-布

2013年10月28日 ⁄ 综合 ⁄ 共 1318字 ⁄ 字号 评论关闭

描述

石头-剪刀-布是两个人玩的游戏。假设有两个人A和B,每个人都独立地选择石头,布或剪刀。选布的赢选石头的,选剪刀的赢选布的,选石头的赢选剪刀的,选相同的既不赢又不输。
n个人参加,每个人与其他每个人比k轮石头-布-剪刀游戏,总共最多要赛k*n*(n-1)/2场。你的工作是计算每个人赢的平均数,这个平均数定义为W/(W+L),其中W是赢的场数,而L是输的场数。

输入

输入有多个测试用例。每个测试用例的第一行是n,k(1 ≤ n ≤ 1000 ,1 ≤ k ≤ 10000),n是参加的人数,k是每个人比赛的场数。对每场比赛,由包含四个整数的一行表示:p1,m1,p2,m2.其中1 ≤p1 ≤n,1 ≤p2 ≤n表示比赛的两人,m1,m2分别是他们出的手势(“rock”,“scissors”,或“paper”)。最后以一个0表示输入结束。

输出

对每个参加者各输出一行,给出他们赢的平均场数,结果保留三位小数。如果赢的平均场数不定,则输出“-”。两测试用例间输出一空行。

样例输入

2 4
1 rock 2 paper
1 scissors 2 paper
1 rock 2 rock
2 rock 1 scissors
2 1
1 rock 2 paper
0

样例输出

0.333
0.667

0.000
1.000

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int n,m,p1,p2,k,t=0;
    double ying[1000];
    double shu[1000];
    char a[100],b[100];
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        if(t)
            {
                printf("\n");
            }
        t++;
        scanf("%d",&k);
        memset(ying,0,sizeof(ying));
        memset(shu,0,sizeof(shu));
        for(int i=0;i<k*n*(n-1)/2;i++)
        {
            scanf("%d %s %d %s",&p1,&a,&p2,&b);
            if((a[0]=='r'&&b[0]=='r')||(a[0]=='s'&&b[0]=='s')||(a[0]=='p'&&b[0]=='p'))continue;//r石头,s剪刀,p布
             if(a[0]=='r'&&b[0]=='s'||a[0]=='s'&&b[0]=='p'||a[0]=='p'&&b[0]=='r')
             {
                 ying[p1]+=1;shu[p2]+=1;
             }
             else    if(a[0]=='s'&&b[0]=='r'||a[0]=='p'&&b[0]=='s'||a[0]=='r'&&b[0]=='p')
             {
                 ying[p2]++;shu[p1]++;
             }

        }
        for(int i=1;i<=n;i++)
        {
            double sum=1.0;
            if(ying[i]==0&&shu[i]==0)printf("-\n");
            else
            {

                 sum=(ying[i]*1.000)/(ying[i]+shu[i])*1.000;
                 printf("%.3lf\n",sum);
            }
        }
    }
    return 0;
}

抱歉!评论已关闭.