题目描述:一个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,1,1,0},
{0,1,2,2,2},
{0,0,0,0,1},
{0,0,0,1,1},
{0,0,0,1,1},
{0,0,0,1,1},
{0,1,1,1,2},
{0,1,1,2,2},
{0,0,0,0,1}
};
int w[13][5]= {
{0,0,0,0,0},