蓝桥杯算法双周赛心得——被替换的身份证(分类讨论)

大家好,我是晴天学长,分类讨论一定要细节啊,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


1) .被替换的身份证

在这里插入图片描述
被替换的身份证【算法赛】
问题描述
由于沐风在前两次蓝桥杯周赛中表现不佳,因此被浅梦戏称为Joker。现在,浅梦取来了两幅扑克牌,但将其中的大小王(大王一→>Red Joker,小王→Black Joker)替换成了沐风的身份证与身份证复印件。
于是现在扑克牌里的Red 3oker变成:
【诛迭香】b服沐风#71
Black Joker变成:
【迷选香】b服沐风#71
扑克牌的游戏规则如下:
1.单张扑克牌的大小顺字为:3<4<5<6<了<8<9<X<J<Q<K<A<2<M<F。
2两张相同的牌可以组成"对子',对子只能与对子比较,对子和单张无法互相响应,对子的大小关系为33<44<55<66<77<88<99<XX<3]<QQ<KK<AA<22<MM<FF。
3.MF 是最大的牌,也被称作"王炸',它能大于所有的对子和单张。
4.当轮到某一方出牌时,出的牌必须比对手出的牌要大。如果无法响应对手出的牌,则由对手继续出牌。5.每一次出牌,玩家可以出单张.对子或王炸中的一种,但必须符合1,2,3,4-号规则。
现在浅梦和沐风从两副扑壳牌中随机抽取两张牌,由浅梦先手。两人都采用最优策略出牌,最先出完所有牌的人获胜。若浅梦获胜,输出shallowOream;若沐风获胜,输出Joker。你能判断谁会获胜吗?
输入格式
第1行输入一个正整数T,表示测试用例数量。
接来下T行,每行输入2个由空格隔开且长度为2的字符串,第1个字符串代表浅梦随机抽取的2张牌,第$个字符串代表沐风随机抽取的2张牌。
输出格式
输出T行,每行输出1个字符串,如果浅梦获胜,则输出ShallowDream;


2) .算法思路

假设一方获胜

1.接受数据
2.假设潜梦醒
无非就是,出单,对子,(王炸有的话必赢)。


3).算法步骤

1.创建一个字符串s,其中包含了扑克牌的排列顺序。
2.创建一个空字符串s1,用于接收输入的数据。
3.通过读取输入的第一行,将其转换为整数T,表示测试用例的数量。
4.进入一个循环,循环次数为测试用例的数量T。
5.通过读取输入的每一行,将其存储在字符串s1中,并使用空格分割为两部分。
6.将分割后的第一部分赋值给字符串qian,表示先手玩家手中的牌。
7.将分割后的第二部分赋值给字符串ling,表示后手玩家手中的牌。
8.进行先手必赢的情况判断:
(1)如果先手玩家的牌是"MF",或者两张牌相同,或者是"FM",则输出"ShallowDream",表示先手玩家必胜。
9.进行后手必赢的情况判断:
(1)如果后手玩家的牌是"MF"或者"FM",则输出"Joker",表示后手玩家必胜。
10.处理其他情况,即先手和后手都没有必胜的情况:
(1)由于先手只能出单牌,所以只需要比较双方手中牌的最大值即可。
(2)使用字符串s中的索引来确定牌的大小,找到先手玩家和后手玩家手中牌的最大值。
(3)如果先手玩家手中的最大牌大于等于后手玩家手中的最大牌,则输出"ShallowDream"。
(4)否则,输出"Joker"。
11.循环结束后,程序结束。


4). 代码实例

import jdk.swing.interop.SwingInterOpUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
        String s = "3456789XJQKA2MF";
        String s1 = "";
        s1 = in.readLine();
        int T = Integer.parseInt(s1);
        for (int i = 0; i < T; i++) {
            s1 = in.readLine();
            String[] tokens = s1.split(" ");
            String qian = tokens[0];
            String ling = tokens[1];
            //先手必赢的情况
            if (qian.equals("MF") || (qian.charAt(0) == qian.charAt(1) || qian.equals("FM"))) {
                System.out.println("ShallowDream");
                continue;
            }

            if (ling.equals("MF") || ling.equals("FM")) {
                System.out.println("Joker");
                continue;
            }
            //其他情况,就是拿的两个不一样的牌,只能出单子,并且两个人没有王炸的情况。
            //只能单的单的比,因为先手出不起双的。
            //只需要比较双方的牌中,有谁的牌最大,就赢。
            int qiandan = Math.max(s.indexOf(qian.charAt(0)), s.indexOf(qian.charAt(1)));
            int lingdan = Math.max(s.indexOf(ling.charAt(0)), s.indexOf(ling.charAt(1)));
            if (qiandan >= lingdan) {
                System.out.println("ShallowDream");
            } else {
                System.out.println("Joker");
            }
        }
    }
}


4).总结

  • 正确的分类讨论,注意MF和FM的情况。

试题链接:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晴天学长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值