Hits and Blows 問題作成:泉 解答作成:荒木、三廻部 英訳:泉 解説:荒木 問題の説明 • 一人が、0123~9876の4桁の数字(異なる桁に同じ 数字(0~9)を含まない)のうち一つを秘密の数字とし て選ぶ。 • もう一人が、それを以下の手順を繰り返して推測す る。 – 何か数字を言い、それに対してhitの数とblowの数を教え てもらう。hitとは場所も数字もあっている桁、blowとは場 所が異なるが数字があっている桁 – 0123 にたいして0324を言った場合は、hit:2,blow:1 • これまでのやり取りの履歴が与えられる • これまでのやり取りから秘密の数字が分かる 時はその数字を出力する。 • そうではないが、次にある数字を言えば、そ れに対する答えから秘密の数字が分かるな らば、その言うべき数字のうち最小のものを 出力する。 • 上記のいずれでもない場合は????を出力す る。 解法 • 全探索 • 0123~9876から、履歴のhitとblowに矛盾しないも のだけを残す。 • 残ったものが一つだけならその数字を出力する。 • 残ったものが二個以上なら、次に言うべき数字の候 補を0123~9876の小さい方から順に一つずつ選び、 その数字を言った時の応答を残った数字全てにつ いて調べる。残った数字全てで応答が異なるなら、 その選んだ数字を言えばよいので、それを出力する。 • どの数字を言っても応答が被ってしまうなら、???? を出力する。 Sample Inputでの動作例 • 履歴が以下の通り – 0123 hit:0 blow:4 – 1230 hit:0 blow:4 • 履歴にマッチする数字は2301か3012 • 0123~9876の小さい方から、次に言う数字の候補 を一つずつ調べる。 – 0123…2301の時はhit:0 blow:4, 3012の時はhit:0 blow:4 被ってしまう – 0132…2301の時はhit:0 blow:4, 3012の時はhit:1 blow:3 被らないので0132が答え。 注意 • 先頭の0を出力する処理をきちんとしましょう。 • 答えを出力する箇所が複数あるのに、一箇 所しかその処理を入れていないプログラムが ありました。 結果 • Submit:12 • Accept:6(first accept: __________57分) • ちなみにコンテスト前予想では全チーム解くと 思っていました…。頑張ってください。
© Copyright 2024 ExpyDoc