#SPJINT1C. 1A2B (Bulls and Cows)
1A2B (Bulls and Cows)
提示
本题比较考验码力。
这是一道交互题。
注意,请在输出之后,加一行 。
下面给出 的输出方式:
-
printf("! 1234"); fflush(stdout);
-
cout << "!" << 1234 << '\n'; cout.flush();
-
System.out.println("! 1234"); System.out.flush();
-
print("! 1234") stdout.flush()
背景
众所周知,cls 最近给 OJ 增加了很多道难度较大的搜索题。
为了解决这些搜索题,PC 每天都在和大法师(dfs)、蝙蝠衫(bfs)博弈。
终于,在连续做了三天搜索题后,他的脑子里仿佛时时刻刻有大法师在爬。
为了防止彻底被大法师上身,他决定去找一些小游戏来玩一玩,放松一下。
在论坛上逛了好久后,一款叫做 1A2B 的益智猜数游戏吸引了 PC 的注意。
但这款游戏需要两个人一起游玩,而 O神 又在忙着打 Arcaea,所以 PC 现在决定和你来一起玩这个小游戏。
说明
每次游戏开始时,PC 会在心里想出一个四位数 。
可能包含前导 ,但保证 由 中不同的四个数字组成。
比如说, 是合法的, 是不合法的。
你可以随意想一个四位数 然后告诉 PC,PC 会根据你的询问,回答你一个字符串,字符串按照 的格式给出。
询问的四位数 也可以包含前导 ,且没有类似于 的 由不同数字组成 的限制。
回答中的 是根据以下规则来确定的:
- 遍历 的每一位数字;
- 每有一位数字 位置相同且值相同,则 加一;
- 每有一位数字 位置不相同但值相同,则 加一
比如:
,你将会得到 ,因为 中的数字 在 中都出现了,但是位置都不相同。
,你将会得到 ,因为 中的数字 在 中都出现了,但是 对应的位置 相同, 对应的位置 不相同。
,你将会得到 ,因为 中的数字 在 中都出现了,但是前两个 对应的位置 相同,后两个 对应的位置 不相同。
显然,只要询问次数够多,猜对指定的数字是很容易的。
所以,PC 想考考你,如何在最多 次询问里,确定具体的四位数字呢?
有趣的是, 次绝对不是最优解,但是本题放宽了限制。
交互
本题有多组测试用例。
首先,你需要读入一行整数 ,代表测试用例的数量。
接下来,对于每个测试用例,你需要进行最多 次询问,并确定答案。
对于一次询问,输出 ? y
,代表你给 PC 的四位数字 。
接下来,读入一个字符串 ,如果 不为 ok
,代表 不是四位数字 或 询问次数超过了 次,此时你需要立刻退出程序以得到 Wrong Answer
判定,否则你会遇到其他任意可能的评测结果。如果 为 ok
,请继续接下来的读入。
接下来,读入一个字符串 ,代表 PC 的回复,并进行你的下一步计算。
如果你能唯一确定答案,输出 ! x
,代表 PC 的数字 。
同样的,你需要读入一个字符串 ,如果 不为 ok
,代表你猜错了,此时你需要立刻退出程序以得到 Wrong Answer
判定,否则你会遇到其他任意可能的评测结果。如果 为 ok
,请继续接下来的读入。
只要你的答案是正确的,你就会得到 Accepted
判定。
如果你没有在输出后 ,你将会得到除 Accepted
之外的其他任意评测结果。
样例
样例输入1
2
ok
3A0B
ok
2A1B
ok
ok
0A3B
ok
2A1B
ok
3A0B
ok
样例输出1
? 2738
? 2734
! 2748
? 9782
? 7829
? 3827
! 3825
样例解释1
在第一个测试用例中,
玩家给出了询问 , 在 中出现了,且位置均相同,因此返回 。
玩家给出了询问 , 在 中出现了,且 对应的位置相同, 对应的位置不相同,因此返回 。
此时, 个位置的数字都已确定,从而玩家确定答案为 。
请注意,样例的询问方式和游玩方式似乎很愚蠢,所以它也许只是一个形象化的例子。
提示
可能包含前导 ,但保证 由 中不同的四个数字组成。
询问的四位数 也可以包含前导 ,且没有类似于 的 由不同数字组成 的限制。