【题解】P1979 [NOIP2013 提高组] 华容道 搜索、最短路

题目链接

一个直接的想法是考虑状态 \(f[x_1,y_1,x_2,y_2]\) 表示要移动的棋子在 \((x_1,y_1)\) ,空白位置为 \((x_2,y_2)\) 之间的转移,每次询问 BFS 最短路即可,复杂度为 \(O(q(nm)^2)\)

我们实质上关心的是棋子是否能从一个位置移动到另一个位置。

考虑将上述状态按要移动棋子的位置划分成若干个集合,那么我们相当于是要求从一个集合内的某个状态转移到另一个集合的某个状态的最短路。

(算是一种缩点思想?)

集合之间的转移边两端连接的点一定是空白位置与要移动棋子相邻的状态。

考虑集合内有效的转移边,除了起点所在的集合外,我们只在意进集合时的状态和出集合时的状态,我们实际上只关心从某个要移动棋子与空白位置相邻的状态到另一个棋子与空白位置相邻的状态的最小花费。

因此我们要加的转移边:

  • 同一个集合内切换状态的转移边

  • 不同集合间状态的转移边

每个询问可以在 \(O(nm\log nm)\) 的时间内处理。

代码记录

posted @ 2021-10-15 14:40  Themaxmaxmax  阅读(23)  评论(0编辑  收藏  举报