「HLOI2016」黑白棋
题目描述
有这样一种有趣的棋类游戏,假设有一个
- 每次选择一枚棋子进行移动;
- 必须先移动白棋,按照先白棋后黑棋的顺序交替进行;
- 每次选择的棋子可以在水平、垂直以及对角线共计八个方向中的任意方向上移动,棋子每次移动只有当遇到棋盘边界,棋盘中的障碍或者其他的棋子时才会停止;
- 棋盘中的障碍格不能移动。
输入
第一行给出
接下来输入包括
字符 w
表示白色棋子,字符 b
表示黑色棋子,字符 #
表示棋盘中的障碍,字符 *
表示棋盘中的空格。保证黑白棋子数相等。
输出
输出最少需要移动的次数,如果不能从初始的状态移动到最终的状态输出
样例输入
1 | 3 |
样例输出
1 | 5 |
数据范围及约定
对于
对于
对于
时间与空间限制
时间限制:
题解
在做题之前,请注意这句话:
棋子每次移动只有当遇到棋盘边界,棋盘中的障碍或者其他的棋子时才会停止。
我也不知道为什么要注意这句话,听说考试的时候有人被坑了?
五秒不虚,直接 BFS,再搞搞状态描述。棋盘上状态可以用 w
,b
,*
。#
可以忽略并特殊标记),最大的状态是
题解中给出了用 Tire 树完成这种哈希的方法,挺神的。不过我觉得还是直接点好
关于先移动白棋,再移动黑棋,可以发现,奇数步移动白棋,偶数步移动黑棋,这样就可以根据步数的奇偶性判断应该移动的棋子。
时间空间玄学。
代码见这里。