結果

問題 No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう!
コンテスト
ユーザー EvbCFfp1XB
提出日時 2025-12-28 19:22:09
言語 Java
(openjdk 25.0.1)
結果
AC  
実行時間 1,442 ms / 5,000 ms
コード長 12,870 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,789 ms
コンパイル使用メモリ 83,464 KB
実行使用メモリ 90,100 KB
スコア 9,968,637
平均クエリ数 313.63
最終ジャッジ日時 2025-12-28 19:24:42
合計ジャッジ時間 126,843 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 100
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    private static int[] h = new int[30];
    private static int[] b = new int[30];
    private static int count50 = 0;

    public static void main(String[] args) {
        try {
            solve();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void solve() {
        try (Scanner in = new Scanner(System.in)) {
            ArrayList<String> candidiates = generateCandidates();
            ArrayList<String> prevQ = new ArrayList<>();
            ArrayList<Integer> prevMaxHB = new ArrayList<>();
            String q = candidiates.remove(candidiates.size() - 1);
            for (;;) {
                System.out.println(q);
                System.out.flush();
                updateHB(in);
                if (h[0] == 5 && b[0] == 0) {
                    break;
                }
                if (h[0] == -1 && b[0] == -1) {
                    break;
                }
                if (count50 != count50()) {
                    count50 = count50();
                    prevQ.clear();
                    prevMaxHB.clear();
                }
                int[] is = maxHB();
                int maxHB = is[0];
                int max2HB = is[1];
                if (maxHB == 505 || maxHB == 514 || maxHB == 523 || maxHB == 532 || maxHB == 541) {
                    if (max2HB == 505 || max2HB == 514 || max2HB == 523 || max2HB == 532 || max2HB == 541) {
                        prevQ.clear();
                        prevMaxHB.clear();
                        for (int i = candidiates.size() - 1; i >= 0; i--) {
                            String candidiate = candidiates.get(i);
                            if (hb(candidiate, q) == maxHB) {
                                prevQ.add(q);
                                prevMaxHB.add(maxHB);
                                q = candidiate;
                                remove(candidiates, i);
                                break;
                            }
                        }
                    } else {
                        boolean find = false;
                        for (int i = candidiates.size() - 1; i >= 0; i--) {
                            String candidiate = candidiates.get(i);
                            if (hb(candidiate, q) == maxHB && hbs(candidiate, prevQ, prevMaxHB)) {
                                prevQ.add(q);
                                prevMaxHB.add(maxHB);
                                q = candidiate;
                                remove(candidiates, i);
                                find = true;
                                break;
                            }
                        }
                        if (!find) {
                            for (int i = candidiates.size() - 1; i >= 0; i--) {
                                String candidiate = candidiates.get(i);
                                if (hb(candidiate, q) == maxHB) {
                                    prevQ.add(q);
                                    prevMaxHB.add(maxHB);
                                    q = candidiate;
                                    remove(candidiates, i);
                                    break;
                                }
                            }
                        }
                    }
                } else {
                    for (int i = candidiates.size() - 1; i >= 0; i--) {
                        String candidiate = candidiates.get(i);
                        int hb = hb(candidiate, q);
                        if (hb == 505 || hb == 514 || hb == 523 || hb == 532 || hb == 541) {
                            remove(candidiates, i);
                        }
                    }

                    if (maxHB == 404 || maxHB == 413 || maxHB == 422 || maxHB == 431 || maxHB == 440) {
                        for (int i = candidiates.size() - 1; i >= 0; i--) {
                            String candidiate = candidiates.get(i);
                            if (hb(candidiate, q) == maxHB) {
                                prevQ.add(q);
                                prevMaxHB.add(maxHB);
                                q = candidiate;
                                remove(candidiates, i);
                                break;
                            }
                        }
                    } else {
                        for (int i = candidiates.size() - 1; i >= 0; i--) {
                            String candidiate = candidiates.get(i);
                            int hb = hb(candidiate, q);
                            if (hb == 404 || hb == 413 || hb == 422 || hb == 431 || hb == 440) {
                                remove(candidiates, i);
                            }
                        }
                        if (maxHB == 303 || maxHB == 312 || maxHB == 321 || maxHB == 330) {
                            for (int i = candidiates.size() - 1; i >= 0; i--) {
                                String candidiate = candidiates.get(i);
                                if (hb(candidiate, q) == maxHB) {
                                    prevQ.add(q);
                                    prevMaxHB.add(maxHB);
                                    q = candidiate;
                                    remove(candidiates, i);
                                    break;
                                }
                            }
                        } else {
                            for (int i = candidiates.size() - 1; i >= 0; i--) {
                                String candidiate = candidiates.get(i);
                                int hb = hb(candidiate, q);
                                if (hb == 303 || hb == 312 || hb == 321 || hb == 330) {
                                    remove(candidiates, i);
                                }
                            }
                            if (maxHB == 202 || maxHB == 211 || maxHB == 220) {
                                for (int i = candidiates.size() - 1; i >= 0; i--) {
                                    String candidiate = candidiates.get(i);
                                    if (hb(candidiate, q) == maxHB) {
                                        prevQ.add(q);
                                        prevMaxHB.add(maxHB);
                                        q = candidiate;
                                        remove(candidiates, i);
                                        break;
                                    }
                                }
                            } else {
                                for (int i = candidiates.size() - 1; i >= 0; i--) {
                                    String candidiate = candidiates.get(i);
                                    int hb = hb(candidiate, q);
                                    if (hb == 202 || hb == 211 || hb == 220) {
                                        remove(candidiates, i);
                                    }
                                }
                                if (maxHB == 101 || maxHB == 110) {
                                    for (int i = candidiates.size() - 1; i >= 0; i--) {
                                        String candidiate = candidiates.get(i);
                                        if (hb(candidiate, q) == maxHB) {
                                            prevQ.add(q);
                                            prevMaxHB.add(maxHB);
                                            q = candidiate;
                                            remove(candidiates, i);
                                            break;
                                        }
                                    }
                                } else {
                                    for (int i = candidiates.size() - 1; i >= 0; i--) {
                                        String candidiate = candidiates.get(i);
                                        int hb = hb(candidiate, q);
                                        if (hb == 101 || hb == 110) {
                                            remove(candidiates, i);
                                        }
                                    }
                                    if (maxHB == 0) {
                                        for (int i = candidiates.size() - 1; i >= 0; i--) {
                                            String candidiate = candidiates.get(i);
                                            if (hb(candidiate, q) == maxHB) {
                                                prevQ.add(q);
                                                prevMaxHB.add(maxHB);
                                                q = candidiate;
                                                remove(candidiates, i);
                                                break;
                                            }
                                        }
                                    } else {
                                        for (int i = candidiates.size() - 1; i >= 0; i--) {
                                            String candidiate = candidiates.get(i);
                                            int hb = hb(candidiate, q);
                                            if (hb == 0) {
                                                remove(candidiates, i);
                                            }
                                        }
                                        prevQ.add(q);
                                        prevMaxHB.add(maxHB);
                                        q = candidiates.remove(candidiates.size() - 1);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private static boolean hbs(String candidiate, ArrayList<String> prevQ, ArrayList<Integer> prevMaxHB) {
        for (int i = Math.max(0, prevQ.size() - 2); i < prevQ.size(); i++) {
            String q = prevQ.get(i);
            int maxHB = prevMaxHB.get(i).intValue();
            if (hb(candidiate, q) != maxHB) {
                return false;
            }
        }
        return true;
    }

    private static int count50() {
        int count = 0;
        for (int i = 0; i < h.length; i++) {
            if (h[i] == 5 && b[i] == 0) {
                count++;
            }
        }
        return count;
    }

    private static void remove(ArrayList<String> candidiates, int i) {
        Collections.swap(candidiates, i, candidiates.size() - 1);
        candidiates.remove(candidiates.size() - 1);
    }

    private static void updateHB(Scanner in) {
        for (int i = 0; i < h.length; i++) {
            h[i] = in.nextInt();
            b[i] = in.nextInt();
        }
    }

    private static ArrayList<String> generateCandidates() {
        ArrayList<String> candidiates = new ArrayList<>();
        for (int i = 0; i <= 99999; i++) {
            StringBuilder sb = new StringBuilder();
            int v = i;
            for (int j = 0; j < 5; j++) {
                sb.append(v % 10);
                v /= 10;
            }
            if (valid(sb)) {
                candidiates.add(sb.toString());
            }
        }
        Collections.shuffle(candidiates);
        return candidiates;
    }

    private static int hb(String s, String t) {
        int h = 0;
        int b = 0;
        for (int i = 0; i < 5; i++) {
            int j = t.indexOf(s.charAt(i));
            if (i == j) {
                h++;
            } else if (j >= 0) {
                b++;
            }
        }
//        for (int i = 0; i < 5; i++) {
//            for (int j = 0; j < 5; j++) {
//                if (j == i) {
//                    continue;
//                }
//                if (s.charAt(i) == t.charAt(j)) {
//                    b++;
//                }
//            }
//        }
        return 100 * (h + b) + 10 * h + b;
    }

    private static int[] maxHB() {
        int max = 0;
        int max2 = 0;
        for (int i = 0; i < h.length; i++) {
            int hb = 100 * (h[i] + b[i]) + 10 * h[i] + b[i];
            if (hb == 550) {
                continue;
            }
            if (hb > max) {
                max2 = max;
                max = hb;
            } else if (hb > max2) {
                max2 = hb;
            }
        }
        return new int[] { max, max2, };
    }

    private static boolean valid(StringBuilder sb) {
        for (int i = 0; i < sb.length(); i++) {
            for (int j = i + 1; j < sb.length(); j++) {
                if (sb.charAt(j) == sb.charAt(i)) {
                    return false;
                }
            }
        }
        return true;
    }
}
0