这是一个交互式问题。
……在今晚的噩梦中,你与一位巫师交谈……开了一个糟糕的玩笑,你发现自己变成了一枚白棋棋子,置身于棋盘之上。你可以看到自己位于 e2,但你不知道自己是谁——是兵(Pawn)、车(Rook)、马(Knight)、象(Bishop)、后(Queen)还是王(King)。你无法询问其他棋子,因为棋盘上只有你一个。
你决定选择一个格子并尝试移动到该格子。如果该移动对于你的棋子是合法的,你就会移动到该格子;否则,你将留在原地。你计划进行不超过 4 次尝试来确定你的棋子身份,然后回到 e2 格子——否则愤怒的巫师可能会把你变成比棋子更糟糕的东西……
注意,白棋棋子的移动方式如下:
- 兵(Pawn)——向前移动一格(即保持列不变,行号加 1)。
- 车(Rook)——在同一行或同一列移动任意数量的格子。
- 象(Bishop)——沿四个对角线方向移动任意数量的格子。
- 马(Knight)——沿一个方向移动两格,再沿两个正交方向之一移动一格,呈 L 型移动。
- 后(Queen)——在同一行、列或对角线方向移动任意数量的格子。
- 王(King)——移动到与当前格子有公共点的 8 个格子中的任意一个。
此处不适用更复杂的国际象棋规则(如兵的首次双步移动或到达底线后的升变)。
格子由 2 个字符的字符串表示:第一个字符是 ‘a’ 到 ‘h’ 之间的字母,表示列;第二个字符是 ‘1’ 到 ‘8’ 之间的数字,表示行。
交互
交互由你的程序开始,通过打印格式为 ? target 的尝试,其中 target 是棋盘坐标表示的格子。如果成功,你将收到整数 1(此时你位于 target 格子),如果失败,你将收到 0 且位置保持不变。
如果你想输出答案,请打印 ! c,其中 c 是表示棋子的小写英文字母:‘p’ 代表兵,‘r’ 代表车,‘b’ 代表象,‘n’ 代表马,‘q’ 代表后,‘k’ 代表王。你只能执行此操作一次;请确保在打印答案时你位于 e2 格子。此操作不计入查询次数。如果你打印了答案但不在 e2 格子,则判定为错误。
样例
样例输入 1
0 1 0 1 1
样例输出 1
? g3 ? e3 ? d2 ? e5 ? e2 ! r
说明
样例中的交互仅用于阐明输出格式:对于正确的解法,5 次尝试次数过多。