[NOI2005]智慧珠游戏

这篇博客介绍了如何应用Knuth的Dancing-Link算法解决NOI2005比赛中的智慧珠游戏问题。这是一个精确覆盖问题,通过建立模型并利用Dancing-Link模板进行高效搜索。文章提到,虽然DL算法效率高,但处理零件的旋转和翻转会导致行数增加,可能导致超时(TLE)。为了解决这个问题,作者提出了在变换时进行重判的方法,以优化算法,实现所有数据的秒出结果。
摘要由CSDN通过智能技术生成

题目描述:一个10*10的直角三角形拼盘,给你12种长得各不相同的奇奇怪怪的零件,要求放入所有零件,刚好覆盖拼盘。

输入:一个拼盘,包括已经放好的零件。

输出:一种覆盖方案。


众所周知,对于这种精确覆盖类型的问题,可以用Knuth神发明的Dancing-Link进行搜索。


在精确覆盖问题中,行表示决策,列表示任务,于是建好模型之后,直接套Dancing-Link模版就行了,搜索效率十分高。


值得一提的是,DL即使效率高,仍然要尽量优化。

这题的一个头疼之处在于不仅要打常量表,还要考虑旋转与翻转,这样一来DL的行数就会较多,上升至5k行左右,跑起来就有些吃力了,会不幸TLE……

解决方法很简单,根据不同的零件的特征,变换时稍微注意判下重就好了,这样所有数据都是秒出结果。


Code:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxnode=100000;
#define GO(j,s,A) for(j=A[s]; j!=s; j=A[j])
 
int v[13][5]= {
     {0,0,0,0,0},
     {0,1,0,0,0},
     {0,0,0,0,0},
     {0,0,0,1,0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值