PAT-乙级B1018-锤子剪刀布

本文详细解析了CJJ博弈问题的策略分析与代码实现,通过统计甲乙双方出拳结果,计算出各自获胜的概率,并找出最优出手选择。文章采用C语言编程,展示了如何通过数组记录每种出拳情况下的胜负次数,最终根据统计结果确定最优策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不难,有点繁琐。

思路是:1、分别考虑甲出锤、石头、布的情况下,乙出不同的手势对应的结果。写一段代码,其他两段复制后稍作修改即可。

               2、jia[max]数组存储的分别是赢、平、输的次数,乙的反过来输出即可。

               3、a[max]数组存储的分别是出C、J、B赢的次数,b[max]数组存储的分别是出C、J、B赢的次数。

               4、先考察如果出布赢的次数大于等于出其他的次数,那么打印布,否则考察锤、剪刀。

#include <stdio.h>
int main()
{
    int n, i;
    int jia[5]={0}, a[5]={0}, b[5]={0};
    char n1, n2, temp1, temp2;
    scanf("%d", &n);
    for (i=0; i<n; i++) {
        getchar();
        scanf("%c %c", &n1, &n2);
        //printf("%c %c\n", n1, n2);                         //测试代码
        if (n1=='C') {                    //甲出锤
            if (n2=='C')  {
                jia[2]++;               //平局
            }else if (n2=='J') {
                jia[1]++;               //甲赢,即乙输
                a[1]++;                 //甲出锤赢
            }else if (n2=='B') {
                jia[3]++;               //甲输,即乙赢
                b[3]++;                 //乙出布赢
            }                               //a和b的1、2、3分别表示C、J、B
        }else if (n1=='J') {             //甲出剪
            if (n2=='C')  {
                jia[3]++;
                b[1]++;
            }else if (n2=='J') {
                jia[2]++;
            }else if (n2=='B') {
                jia[1]++;
                a[2]++;
            }                
        }else if (n1=='B') {              //甲出布
            if (n2=='C')  {
                jia[1]++;
                a[3]++;
                //printf("%d %d\n", jia[1], a[3]);         //测试代码
            }else if (n2=='J') {
                jia[3]++;
                b[2]++;
            }else if (n2=='B') {
                jia[2]++;
            }
        }
    }       //统计输赢次数以及出什么赢的
    printf("%d %d %d\n", jia[1], jia[2], jia[3]);
    printf("%d %d %d\n", jia[3], jia[2], jia[1]);
    //printf("%d %d %d\n", a[1], a[2], a[3]);             //测试代码
    //printf("%d %d %d\n", b[1], b[2], b[3]);             //测试代码
    
    if (a[3]>=a[1] && a[3]>=a[2]) temp1='B';    //注意判断的先后顺序应该B C J,即按字母序来
    else if (a[1]>=a[2] && a[1]>=a[3]) temp1='C';
    else temp1='J';                   //存储甲胜算最大的
    
    if (b[3]>=b[1] && b[3]>=b[2]) temp2='B';
    else if (b[1]>=b[2] && b[1]>=b[3]) temp2='C';
    else temp2='J';                   //存储乙胜算最大的

    printf("%c %c", temp1, temp2);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值