NOIP Practice Recordings S

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) 来进行扩展,最终状态第一次被从堆中取出时就是最优解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值