結果

問題 No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう!
コンテスト
ユーザー EvbCFfp1XB
提出日時 2025-12-28 17:02:29
言語 Java
(openjdk 25.0.1)
結果
AC  
実行時間 2,682 ms / 5,000 ms
コード長 9,368 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,925 ms
コンパイル使用メモリ 82,160 KB
実行使用メモリ 86,996 KB
スコア 9,848,896
平均クエリ数 1511.04
最終ジャッジ日時 2025-12-28 17:06:46
合計ジャッジ時間 246,189 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
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];

    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();
            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;
                }
                int maxHB = maxHB();
                if (maxHB == 505 || maxHB == 514 || maxHB == 523 || maxHB == 532 || maxHB == 541) {
                    for (int i = candidiates.size() - 1; i >= 0; i--) {
                        String candidiate = candidiates.get(i);
                        if (hb(candidiate, q) == 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) {
                                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) {
                                    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) {
                                        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);
                                    }
                                }
                                q = candidiates.remove(candidiates.size() - 1);
//                                if (maxHB == 1 || maxHB == 10) {
//                                    for (int i = candidiates.size() - 1; i >= 0; i--) {
//                                        String candidiate = candidiates.get(i);
//                                        if (hb(candidiate, q) == maxHB) {
//                                            q = candidiate;
//                                            candidiates.remove(i);
//                                            break;
//                                        }
//                                    }
//                                } else {
//                                    for (int i = candidiates.size() - 1; i >= 0; i--) {
//                                        String candidiate = candidiates.get(i);
//                                        int hb = hb(candidiate, q);
//                                        if (hb == 1 || hb == 10) {
//                                            candidiates.remove(i);
//                                        }
//                                    }
//                                    if (maxHB == 0) {
//                                        for (int i = candidiates.size() - 1; i >= 0; i--) {
//                                            String candidiate = candidiates.get(i);
//                                            if (hb(candidiate, q) == maxHB) {
//                                                q = candidiate;
//                                                candidiates.remove(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) {
//                                                candidiates.remove(i);
//                                            }
//                                        }
//                                        q = candidiates.remove(0);
//                                    }
//                                }
                            }
                        }
                    }
                }
            }
        }
    }

    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++) {
            if (s.charAt(i) == t.charAt(i)) {
                h++;
            }
        }
        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;
        for (int i = 0; i < h.length; i++) {
            int hb = 100 * (h[i] + b[i]) + 10 * h[i] + b[i];
            if (hb != 550) {
                max = Math.max(max, hb);
            }
        }
        return max;
    }

    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