最优的解使得出牌次数最多

华为机试–最后一题
UNO卡牌,最优的解使得出牌次数最多

1 4 3 4 5
r y b b r
3

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main2 {
    class Poker {
        String digital;
        String color;
        boolean has;

        public String getDigital() {
            return digital;
        }

        public void setDigital(String digital) {
            this.digital = digital;
        }

        public String getColor() {
            return color;
        }

        public void setColor(String color) {
            this.color = color;
        }

        public boolean isHas() {
            return has;
        }

        public void setHas(boolean has) {
            this.has = has;
        }

        @Override
        public String toString() {
            return "Poker{" +
                    "digital='" + digital + '\'' +
                    ", color='" + color + '\'' +
                    ", has=" + has +
                    '}';
        }
    }
// 1 4 3 4 5  r y b b r
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line1 = in.nextLine();
        String line2 = in.nextLine();
        String[] digitalList = line1.split(" ");
        String[] colorList = line2.split(" ");
        List<Poker> pokers = new ArrayList<>();
        for (int i = 0; i < digitalList.length; i++) {
            Poker poker = new Main2().new Poker();
            poker.setDigital(digitalList[i]);
            poker.setColor(colorList[i]);
            poker.setHas(true);
            pokers.add(poker);
        }
        if (pokers.size() <= 2){
            System.out.println(pokers.size());
        }

        int max = 1;
        for (int i = 0; i < pokers.size(); i++) {
            int temp = hasNext(pokers, pokers.get(i), 1);
            if (temp > max){
                max = temp;
            }
        }
        System.out.println(max);

    }

    public static int hasNext(List<Poker> pokers, Poker targetPoker, int max) {
        targetPoker.setHas(false);
        Poker poker1 = exitDigital(pokers, targetPoker);
        if (poker1 == null) {
            Poker poker2 = exitColor(pokers, targetPoker);
            if (poker2 == null) {
                targetPoker.setHas(true);
                return max;
            } else {
                max = hasNext(pokers, poker2, ++max);
            }
        } else {
            max = hasNext(pokers, poker1, ++max);
        }
        targetPoker.setHas(true);
        return max;
    }

    public static Poker exitDigital(List<Poker> pokers, Poker targetPoker) {
        for (Poker p :
                pokers) {
            if (p.isHas() && p.getDigital().equals(targetPoker.getDigital()) && !p.getColor().equals(targetPoker.getColor())) {
                p.setHas(false);
                return p;
            }
        }
        return null;
    }

    public static Poker exitColor(List<Poker> pokers, Poker poker) {
        for (Poker p :
                pokers) {
            if (p.isHas() && p.getColor().equals(poker.getColor()) && !p.getDigital().equals(poker.getDigital())) {
                p.setHas(false);
                return p;
            }
        }
        return null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值