Dr. Black 被谋杀了。侦探 Jill 必须确定凶手、案发地点和凶器。共有 6 名可能的凶手,编号为 1 到 6。共有 10 个可能的地点,编号为 1 到 10。共有 6 种可能的凶器,编号为 1 到 6。
仅作说明,我们列出了可能的凶手、地点和凶器的名称。解题不需要这些名称。
| 凶手 | 地点 | 凶器 |
|---|---|---|
| 1. Professor Plum | 1. Ballroom | 1. Lead pipe |
| 2. Miss Scarlet | 2. Kitchen | 2. Dagger |
| 3. Colonel Mustard | 3. Conservatory | 3. Candlestick |
| 4. Mrs. White | 4. Dining Room | 4. Revolver |
| 5. Reverend Green | 5. Billiard Room | 5. Rope |
| 6. Mrs. Peacock | 6. Library | 6. Spanner |
| 7. Lounge | ||
| 8. Hall | ||
| 9. Study | ||
| 10. Cellar |
Jill 反复尝试猜测凶手、地点和凶器的正确组合。每一次猜测被称为一个“理论”(theory)。她要求助手 Jack 依次确认或反驳每一个理论。当 Jack 确认一个理论时,Jill 的任务就完成了。当 Jack 反驳一个理论时,他会告诉 Jill 凶手、地点或凶器中有一个是错误的。
你需要实现过程 Solve 来扮演 Jill 的角色。评测程序将多次调用 Solve,每次处理一个新的案例。Solve 必须反复调用由评测程序实现的 Theory(M, L, W)。$M$、$L$ 和 $W$ 是表示凶手、地点和凶器特定组合的数字。如果理论正确,Theory(M, L, W) 返回 0。如果理论错误,则返回 1、2 或 3。1 表示凶手错误;2 表示地点错误;3 表示凶器错误。如果多项错误,Jack 会在错误的选项中任意选择一个(不一定是确定性的)。当 Theory(M, L, W) 返回 0 时,Solve 应当返回。
样例
例如,假设 Miss Scarlet 实施了谋杀(凶手 2),地点在温室(地点 3),凶器是左轮手枪(凶器 4)。当过程 Solve 对函数 Theory 进行以下调用时,可能会返回第二列中的结果。
输入格式 1
Theory(1, 1, 1) Theory(3, 3, 3) Theory(5, 3, 4) Theory(2, 3, 4)
输出格式 1
1, 2, 或 3 1, 或 3 1 0
说明
Theory(1, 1, 1)返回 1, 2, 或 3:三者皆错。Theory(3, 3, 3)返回 1, 或 3:仅地点正确。Theory(5, 3, 4)返回 1:仅凶手错误。Theory(2, 3, 4)返回 0:全部正确。
子任务 1 [50 分]
每次测试运行可能会调用 Solve 最多 100 次。每次调用可能对应不同的凶手、地点和凶器组合作为答案。每次调用 Solve 时,它必须在不超过 360 次调用 Theory(M, L, W) 的情况下找到正确的理论。请确保每次调用 Solve 时都初始化所使用的任何变量。
子任务 2 [50 分]
每次测试运行可能会调用 Solve 最多 100 次。每次调用 Solve 时,它必须在不超过 20 次调用 Theory(M, L, W) 的情况下找到正确的理论。请确保每次调用 Solve 时都初始化所使用的任何变量。
实现细节
- 实现文件夹:
/home/ioi2010-contestant/cluedo/ - 需由选手实现:
cluedo.c或cluedo.cpp或cluedo.pas - 选手接口:
cluedo.h或cluedo.pas - 评测接口:
grader.h或graderlib.pas - 样例评测程序:
grader.c或grader.cpp或grader.pas以及graderlib.pas - 样例评测程序输入:
grader.in.1- 说明:输入文件的每一行包含三个数字,分别表示凶手、地点和凶器。
- 样例评测程序的预期输出:如果
Solve正确解决了所有案例,输出文件将包含OK t,其中 $t$ 是任何案例中调用Theory的最大次数。 - 编译并运行(命令行):
runc grader.c或runc grader.cpp或runc grader.pas - 编译并运行(gedit 插件):编辑任何实现文件时按
Control-R。 - 提交(命令行):
submit grader.c或submit grader.cpp或submit grader.pas - 提交(gedit 插件):编辑任何实现或评测文件时按
Control-J。