#ijpchonest. [ijpc_honest]しょうじききつね と うそつきにんげん (Honest Fox and Dishonest Man)
[ijpc_honest]しょうじききつね と うそつきにんげん (Honest Fox and Dishonest Man)
課題
N 人の人間がおり、0 から N-1 までの異なる整数の番号がつけられている。それぞれの人間は正直か嘘つきのどちらかであり、次の 2 種類の質問を繰り返すことで正直者をすべて特定したい。
- ある人 i に対して「人 j は正直者ですか?」と質問する
- ある人 i に対して「N 人のうち正直者は何人いますか?」と質問する
パラメータ identify(N)
をもつプロシージャを実装する:
- N -- 人の数。人には 0 から N-1 までの異なる整数の番号がつけられている。
identify(N)
中では question(Q, i, j)
を繰り返し呼び出すことができる。question(Q, i, j)
の仕様は次の通り:
- Q=1 のとき
question(Q, i, j)
は人 i に対して「人 j は正直者ですか?」と質問したときの返答を返す。戻り値は Yes を表す 1 か No を表す 0 のいずれかである。 - Q=2 のとき
question(Q, i, j)
は人 i に対して「N 人のうち正直者は何人いますか?」と質問したときの返答を返す。戻り値は 0 以上 N 以下の整数である。このとき j の値は内部で捨てられるので何を指定しても構わない。 - それ以外の Q の値で
question(Q, i, j)
を呼び出すと不正なライブラリ呼び出しとみなし、不正解と判定する。
質問に対し、正直者は常に正しい答を返し嘘つきは常に間違った答を返す。嘘つきの返答は間違いであればどのようなものでもありうるが、同じ質問を繰り返した際には同じ答を返すことは保証されている。
質問を