首先吐槽题目名称:
我想了好久zhzyx是什么...跪跪跪跪跪跪
然后写了个弱B的搜索样例都要2.5s 跪跪跪跪跪跪
然后学了N久的DLX..跪跪跪跪跪跪
总之给邓大牛跪了!膜拜瞬秒DLX的!
Introduction:
之所以叫DLX是因为像跳舞?(雾)
但无论如何Dancing Links is a useful tool which is used to solve a kind of problem called 'exact cover'.
See the PDF here (Chinese ver.)
So how can we use it in this problem? (NOI2005 zhzyx)
其实很简单,但是如果你是第一次做此类题目,那你肯定会很难想到。
把每一个未被覆盖的点(x,y)转化成矩阵的一列,每一种零件的每一种可能的摆放形式转化为占矩阵中的一行, 把其占用的(x,y)格子标记为1,然后再把所有还没有固定的零件每个做一列,把所有属于该基本零件的摆放方式的行标记为1。
所以您大概就知道怎么做了吧..(恕我表达能力有限吧)
然后具体的步骤请看论文吧。
给个code(注意赋初值,你要先考虑一下(0, 0)的编号)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<cmath>
#include<cctype>
#include<bitset>
using namespace std;
const int tt[61][6][2] =
{
{
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
{
{3, 0}, {0, 0}, {0, 1}, {1, 0}, {0, 0}, {0, 0}},
{
{3, 0}, {0, 0}, {0, 1}, {1, 1}, {0, 0}, {0, 0}},
{
{3, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 0}, {0, 0}},
{
{3, 0}, {0, 1}, {1, 0}, {1, 1}, {0, 0}, {0, 0}},
{
{4, 0}, {0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 0}},
{
{4, 0}, {0, 0}, {1, 0}, {2, 0}, {3, 0}, {0, 0}},
{
{4, 0}, {0, 0}, {0, 1}, {0, 2}, {1, 0}, {0, 0}},
{
{4, 0}, {0, 0}, {0, 1}, {0, 2}, {1, 2}, {0, 0}},
{
{4, 0}, {0, 0}, {1, 0}, {1, 1}, {1, 2}, {0, 0}},
{
{4, 0}, {0, 2}, {1,