NOIP Practice Recordings S

NOIP Practice Recordings S,第1张

Search A* luogu1379 八数码难题

  (2021.10.15)

判断可行

3 × 3 3 \times 3 3×3 的九宫格,其中 8 8 8 个格子中有 1 ∼ 8 1 \sim 8 18 8 8 8 个数字。很显然这 8 8 8 个数字有很多种填写方法。我们有一个 *** 作,就是九宫格中没有填数字的方格和旁边的数字交换。现在我们给出两个状态,然后我们要判断两种状态是否能通过若干个 *** 作互相到达,如果能互相到达就输出 *** 作次数最少的一种方法的 *** 作步数。

  首先判断能否相互到达,八数码游戏的两个局面可达,当且仅当把两个局面写成一维形式的时候,逆序对个数的奇偶性相同。证明很简单,分为两种情况。第一种情况:我们左右移动空格位置的时候,一维形式数列不变,所以逆序对奇偶性不变。第二种情况:我们上下移动空格位置的时候,在一维形式上的表现就是某个数与它前(后)面的 2 个数进行位置互换。此时我们又要分两种情况讨论。

  1. 与它进行位置交换的两个数都比它大(小)那么逆序对数量就减少(增加)2。逆序对数量奇偶性不变。
  2. 与他进行交换的两个数一个比他大,另一个比他小,那么逆序对的数量加一再减一就没有变化,所以逆序对数量奇偶性不变。

  然后我们就可以对于两次给出的局面维护一个树状数组求出两次的逆序对数量(也可以用归并排序求逆序对)然后判断奇偶性是否相同就好了。

步数最小

  然后,首先利用上述方法判断是否可解,若问题有解,那我们就采用 A* 算法搜索出一种移动部步数最小的方案。我们令评估函数为当前位置和目标位置有几个数的位置不相同,即:
f ( s t a t e ) = ∑ i = 1 9 ( s t a t e x i = = g o a l x i    a n d    s t a t e y i = = g o a l y i )    ?    0    :    1 f(state) = \sum_{i=1}^{9} (state_{xi} == goal_{xi} \; and \; state_{yi} == goal_{yi}) \; ? \; 0 \; : \; 1 f(state)=i=19(statexi==goalxiandstateyi==goalyi)?0:1
  然后每次我们用当前步数 g(state) 加上 f(state) 来进行扩展,最终状态第一次被从堆中取出时就是最优解。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/871122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存