08:石头剪刀布

一、题目链接

http://noi.openjudge.cn/ch0106/08/

二、解题思路

◎ 循环遍历小A和小B每轮比赛的出拳并进行比较,累加各自获胜的次数,按照获胜次数的多少判断最终的胜负情况;
◎ 数组A[NA]、B[NB]各自存储小A、小B出拳的规律,可以通过A[i%NA]、B[i%NB]获得第i轮中小A和小B的出拳,这里0<=i<N。

三、实施步骤

◆ 方法public String whoWins(int N, int NA, int NB, int[] A, int[] B)处理所有业务逻辑:
   → 参数N为int类型的整数,代表比赛的轮数;
   → 参数NA为int类型的整数,代表小A出拳的周期长度;
   → 参数NB为int类型的整数,代表小B出拳的周期长度;
   → 参数A为int类型的数组,存储小A出拳的规律;
   → 参数B为int类型的数组,存储小B出拳的规律;
   → 方法whoWins返回String类型的字符串,"A"代表小A赢得多,"B"代表小B赢得多,"draw"代表打平。
◇ 方法whoWins实施步骤如下:
◎ 首先,定义String类型的字符串ans,代表小A和小B比赛的结果;
◎ 其次,定义两个int类型的整数winA、winB,分别代表小A、小B赢的次数,初始时均为0;
◎ 然后,通过标记i代表每轮比赛的编号,i从0开始,到N-1为止,更新步长为1,循环处理如下:
   → 如果A[i%NA]==0&&B[i%NB]==2||A[i%NA]==2&&B[i%NB]==5||A[i%NA]==5&&B[i%NB]==0:令winA++;
	 否则如果A[i%NA]==2&&B[i%NB]==0||A[i%NA]==5&&B[i%NB]==2||A[i%NA]==0&&B[i%NB]==5:令winB++;
◎ 第四,比较小A和小B各自获胜的次数:
   → 如果winA>winB:令ans="A";
	 否则如果winA<winB:令ans="B";
	 否则:令ans="draw";
◎ 最后,返回ans。
◇ 在方法main中输入比赛轮数、小A和小B出拳的周期长度、小A和小B出拳的规律,将它们作为参数注入方法whoWins,输出计算结果。

四、Java程序

import java.util.Scanner;

public class Main {
    /**
     * 返回石头剪刀布猜拳游戏中小A和小B比赛的结果
     *
     * @param N  int类型的整数,代表比赛的轮数
     * @param NA int类型的整数,代表小A出拳的周期长度
     * @param NB int类型的整数,代表小B出拳的周期长度
     * @param A  int类型的数组,存储小A出拳的规律
     * @param B  int类型的数组,存储小B出拳的规律
     * @return String类型的字符串,"A"代表小A赢得多,"B"代表小B赢得多,"draw"代表打平
     */
    public String whoWins(int N, int NA, int NB, int[] A, int[] B) {
        String ans; // 小A和小B比赛的结果
        int winA = 0; // 小A赢的次数,初始为0
        int winB = 0; // 小B赢的次数,初始为0
        /* 标记i代表每轮比赛的编号,i从0开始,到N-1为止,更新步长为1 */
        for (int i = 0; i < N; i++) {
            // 如果当前轮小A获胜
            if (A[i % NA] == 0 && B[i % NB] == 2 || A[i % NA] == 2 && B[i % NB] == 5 ||
                 A[i % NA] == 5 && B[i % NB] == 0) {
                winA++;
            }
            // 否则如果当前轮小B获胜
            else if (A[i % NA] == 2 && B[i % NB] == 0 || A[i % NA] == 5 && B[i % NB] == 2 ||
                      A[i % NA] == 0 && B[i % NB] == 5) {
                winB++;
            }
        }
        if (winA > winB) { // 如果小A赢得多
            ans = "A";
        }
        else if (winA < winB) { // 否则如果小B赢得多
            ans = "B";
        }
        else { // 否则,小A和小B打平
            ans = "draw";
        }
        return ans;
    }

    public static void main(String[] args) {
        Main test = new Main();
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        int NA = input.nextInt();
        int NB = input.nextInt();
        int[] A = new int[NA];
        int[] B = new int[NB];
        for (int i = 0; i < NA; i++) {
            A[i] = input.nextInt();
        }
        for (int i = 0; i < NB; i++) {
            B[i] = input.nextInt();
        }
        System.out.print(test.whoWins(N, NA, NB, A, B));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江苏科技大学_计算机学院_潘磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值