【JZOJ3422】水叮当的舞步

水叮当收到一个特殊地毯,踩踏可改变颜色。为讨好虹猫,她需要知道最少多少步使所有格子颜色相同。采用IDA*算法,先将图染色,标记不同颜色的联通块。估价函数为剩余不同颜色数量,限制搜索深度,枚举颜色染色,若联通块大小不变则无效。通过这种方式,能有效解决该问题。
摘要由CSDN通过智能技术生成

description

水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。

为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~

地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。

水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,地毯左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。

由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。


analysis

  • 正解 I D A ∗ IDA* IDA,涨知识了

  • I D D F S IDDFS IDDFS就是迭代加深搜索,具体就是限制搜索树的深度,听着慢但很快

  • A ∗ A* A就是由当前步数加上估价函数来搜索,通常用堆实现

  • 首先每次搜索前把图染色, 1 1 1标记当前颜色的联通块, 2 2 2标记当前颜色联通块外边界上的点,剩下点标记 0 0 0

  • 估价函数取剩下与当前联通块颜色不同的颜色数量,若为 0 0 0即整张图已经被染成一种颜色

  • 如果当前步数加估价函数大于限制的深度,就 r e t u r n return return

  • 搜索中枚举一种颜色染色,如果联通块大小没有变化,那这次染色就没有意义

  • 这样就可以解决问题了,那么以后还要多掌握一些偏门知识


code

#pragma GCC optimize("
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值