题目
现有一个n∗m大小的棋盘,在棋盘的第x行第y列的位置放置了一个棋子,其他位置中的一部分放置了障碍棋子。棋子的走位参照中国象棋的“马”(障碍棋子将成为“马脚”)。求该棋子到棋盘上每个位置的最小步数。
注1
:中国象棋中“马”的走位为“日”字形,如下图所示。
注2
:与“马”直接相邻的棋子会成为“马脚”,“马”不能往以“马”=>“马脚”为长边的方向前进,如下图所示。
思考
利用bfs遍历,最主要的就是处理障碍问题。注意到长边方向前进,前面有障碍的话,就会导致马撇脚。例如上图4*4的棋盘,点坐标为(x,y),马在(2,2),障碍在(3,2),马需要向(1,4)去,则增长量为dx = 2,dy = -1,此时x方向增长量多,即为长边,马在x轴的方向上,有障碍,那么马就不能过去。增量最长也就为2,最小为1,用一个map<PII(坐标),bool> block来存储障碍,所以障碍阻挡了前进的条件判断条件为
block[PII(temp.first + dx[i] / 2,temp.second + dy[i] / 2)]) == true;代表有障碍阻挡了前进方向
!block[PII(temp.first + dx[