#P148S2. [交互] 1A2B
[交互] 1A2B
题目背景
本题比较考验码力。
前段时间,PC 在练习以 dfs 和 bfs 为主的搜索算法,感到些许棘手——以至于某次睡梦中,他梦到了一个大法师。
大法师感受到了他的疲惫,于是丢给了他一个小游戏玩,其名为 1A2B。但这款游戏需要两个人一起游玩,而大法师忙着处理别的事情,于是 PC 决定和你来一起玩这个小游戏。
让我们把这个小游戏抽象为一个问题吧。
这是一道交互题。
注意,请在输出之后,加一行 。
下面给出 的输出方式:
-
printf("! 1234"); fflush(stdout);
-
cout << "!" << 1234 << '\n'; cout.flush();
-
System.out.println("! 1234"); System.out.flush();
-
print("! 1234") stdout.flush()
题目描述
每次游戏开始时,PC 会在心里想出一个四位数 。
可能 包含前导 ,但保证 由 中 不同 的四个数字组成。比如说, 是合法的, 是不合法的。
你可以随意想一个四位数 然后告诉 PC,PC 会根据你的询问,回答你一个字符串,字符串按照 的格式给出。
询问的四位数 也可以包含前导 ,且没有类似于 的 由不同数字组成 的限制。
回答中的 是根据以下规则来确定的:
- 遍历 的每一位数字;
- 每有一位数字 位置相同且值相同,则 加一;
- 每有一位数字 位置不相同但值相同,则 加一
比如:
,你将会得到 ,因为 中的数字 在 中 都出现了,但是位置都不相同。
,你将会得到 ,因为 中的数字 在 中都出现了,但是 对应的位置 相同, 对应的位置 不相同。
,你将会得到 ,因为 中的数字 在 中都出现了,但是前两个 对应的位置 相同,后两个 对应的位置 不相同。
还是没听懂?可以 点击这里 尝试一下!
显然,只要询问次数够多,猜对指定的数字是很容易的。所以,PC 想考考你,如何在最多 次询问里,确定具体的四位数字呢?
有趣的是, 次绝对不是最优解,但是本题放宽了限制。
交互方式
本题有多组测试用例。
首先,你需要读入一行整数 ,代表测试用例的数量。
接下来,对于每个测试用例,你需要进行最多 次询问,并确定答案。
对于一次询问,输出 ? y
,代表你给 PC 的四位数字 。
接下来,读入一个字符串 ,如果 不为 ok
,代表 不是四位数字 或 询问次数超过了 次,此时你需要立刻退出程序以得到 Wrong Answer
判定,否则你会遇到其他任意可能的评测结果。如果 为 ok
,请继续接下来的读入。
接下来,读入一个字符串 ,代表 PC 的回复,并进行你的下一步计算。
如果你能唯一确定答案,输出 ! x
,代表 PC 的数字 。
同样的,你需要读入一个字符串 ,如果 不为 ok
,代表你猜错了,此时你需要立刻退出程序以得到 Wrong Answer
判定,否则你会遇到其他任意可能的评测结果。如果 为 ok
,请继续接下来的读入。
只要你的答案是正确的,你就会得到 Accepted
判定。
如果你没有在输出后 ,你将会得到除 Accepted
之外的其他任意评测结果。
2
ok
3A0B
ok
2A1B
ok
ok
0A3B
ok
2A1B
ok
3A0B
ok
? 2738
? 2734
! 2748
? 9782
? 7829
? 7892
! 7895
提示
样例 1 说明
在第一个测试用例中,
玩家给出了询问 , 在 中出现了,且位置均相同,因此返回 。
玩家给出了询问 , 在 中出现了,且 对应的位置相同, 对应的位置不相同,因此返回 。
此时, 个位置的数字都已确定,从而玩家确定答案为 。
请注意,样例的询问方式和游玩方式似乎很愚蠢,所以它也许只是一个形象化的例子。
数据规模与约定
对于全部的测试点,保证 ,且满足:
- 可能包含前导 ,但保证 由 中不同的四个数字组成。
- 询问的四位数 也可以包含前导 ,且没有类似于 的 由不同数字组成 的限制。
相关
在下列比赛中: