FZU 1686 神龙的难题

pid=1686" target="_blank" style="">题目链接

题意:中文题

思路:每个1看成列,每个位置作为左上角的矩阵看成行。dlx反复覆盖就可以

代码:

#include <cstdio>
#include <cstring> using namespace std; const int MAXNODE = 66666;
const int INF = 0x3f3f3f3f;
const int MAXM = 230;
const int MAXN = 230;
int K; struct DLX { int n,m,size; int U[MAXNODE], D[MAXNODE], R[MAXNODE], L[MAXNODE], row[MAXNODE], col[MAXNODE];
int H[MAXN], S[MAXM];
int ansd, ans[MAXN]; void init(int n,int m) {
this->n = n;
this->m = m;
ansd = INF;
for(int i = 0; i <= m; i++) {
S[i] = 0;
U[i] = D[i] = i;
L[i] = i - 1;
R[i] = i + 1;
}
R[m] = 0; L[0] = m;
size = m;
for(int i = 1; i <= n; i++)
H[i] = -1;
} void Link(int r,int c) {
++S[col[++size] = c];
row[size] = r;
D[size] = D[c];
U[D[c]] = size;
U[size] = c;
D[c] = size;
if(H[r] < 0) H[r] = L[size] = R[size] = size;
else {
R[size] = R[H[r]];
L[R[H[r]]] = size;
L[size] = H[r];
R[H[r]] = size;
}
} void remove(int c) {
for(int i = D[c]; i != c; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
} void resume(int c) {
for(int i = U[c]; i != c; i = U[i])
L[R[i]] = R[L[i]] = i;
} bool v[MAXNODE]; int f() {
int ret = 0;
for(int c = R[0]; c != 0; c = R[c]) v[c] = true;
for(int c = R[0]; c != 0; c = R[c]) {
if(v[c]) {
ret++;
v[c] = false;
for(int i = D[c]; i != c; i = D[i])
for(int j = R[i]; j != i; j = R[j])
v[col[j]] = false;
}
}
return ret;
} void Dance(int d) {
if(d + f() >= ansd) return;
if(R[0] == 0) {
if (d < ansd) ansd = d;
return;
}
int c = R[0];
for(int i = R[0]; i != 0; i = R[i]) {
if(S[i] < S[c])
c = i;
}
for(int i = D[c]; i != c; i = D[i]) {
remove(i);
for(int j = R[i]; j != i; j = R[j]) remove(j);
ans[d] = row[i];
Dance(d + 1);
for(int j = L[i]; j != i; j = L[j]) resume(j);
resume(i);
}
}
} gao; const int N = 20; int n, m, g[N][N], n1, m1, to[N][N]; int main() {
while (~scanf("%d%d", &n, &m)) {
int cnt = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
scanf("%d", &g[i][j]);
if (g[i][j]) to[i][j] = ++cnt;
}
scanf("%d%d", &n1, &m1);
gao.init(n * m, cnt);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int x = 0; x < n1 && i + x < n; x++) {
for (int y = 0; y < m1 && j + y < m; y++) {
if (g[i + x][j + y]) gao.Link(i * m + j + 1, to[i + x][j + y]);
}
}
}
}
gao.Dance(0);
printf("%d\n", gao.ansd);
}
return 0;
}

FZU 1686 神龙的难题(DLX反复覆盖)的更多相关文章

  1. FZU 1686 神龙的难题 DLX反复覆盖

    DLX反复覆盖: 须要一个A*函数剪支 Problem 1686 神龙的难题 Accept: 462    Submit: 1401 Time Limit: 1000 mSec    Memory L ...

  2. FZU 1686 神龙的难题 (重复覆盖)

    Problem 1686 神龙的难题 Accept: 397    Submit: 1258Time Limit: 1000 mSec    Memory Limit : 32768 KB  Prob ...

  3. FZU 1686 神龙的难题 (DLX)

    神龙的难题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  4. (简单) FZU 1686 神龙的难题 , DLX+可重复覆盖。

    Description 这是个剑与魔法的世界.英雄和魔物同在,动荡和安定并存.但总的来说,库尔特王国是个安宁的国家,人民安居乐业,魔物也比较少.但是.总有一些魔物不时会进入城市附近,干扰人民的生活.就 ...

  5. [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)

    Problem 1686 神龙的难题 Accept: 444    Submit: 1365 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Pro ...

  6. HDU 5046 Airport(DLX反复覆盖)

    HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...

  7. HDOJ 2828 Lamp DLX反复覆盖

    DLX反复覆盖模版题: 每一个开关两个状态.但仅仅能选一个,建2m×n的矩阵跑DLX模版.. .. Lamp Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  8. [DLX反复覆盖] hdu 2828 Lamp

    题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...

  9. HDU 4735 Little Wish~ lyrical step~(DLX , 反复覆盖)

    解题思路: DLX 的模板题.反复覆盖. #include <stdio.h> #include <string.h> #include <iostream> #i ...

随机推荐

  1. TFS统计编码行数语句

    ****** Script for SelectTopNRows command from SSMS ******/ SELECT TeamProjectProjectNodeName 项目名称 ,c ...

  2. 关于.net 对excel操作的方法

    asp.net打印文件用的最多的一般2种,word和excel,今天在这里整洁一下关于打印excel的几种方式及优缺点 第一种:直接打印html代码,然后将输出类型伪装成excel文件(excel是可 ...

  3. angularjs不同页面间controller传参方式,使用service封装sessionStorage

    这里分享一个我在实际项目中,使用service封装的一个依赖sessionStorage的传参服务. 这里先说下大背景,在我们的实际开发中,登陆之后一般会存在一个token,这个token将会贯穿全场 ...

  4. excel导出的集中情况

    jsp 页面: 导出按钮: <form id="excel" name="exportForm" method="post" acti ...

  5. C++中的函数指针

    寒假这些天在看<The C++ Programming Language, 3rd>. 今天看到Chapter7 Function,里头好一些东西是C语言里没有的,比如overload.p ...

  6. 中文man帮助安装

    下面我们来安装下中文man帮助 首先在http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.2.tar.bz2 ...

  7. MySQL递归查询所有子节点,树形结构查询

    --表结构 CREATE TABLE `address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code_value` varchar(32) DEFAUL ...

  8. HTML5 canvas图像绘制方法与像素操作属性和方法

    图像绘制方法 drawImage()        向画布上绘制图像.画布或视频 像素操作属性和方法 width                                返回 ImageData ...

  9. Javascript 中神奇的 this

    Javascript 当中的 this 与其他语言是完全不同的机制,很有可能会让一些编写其他语言的工程师迷惑. 1. 误以为 this 指向函数自身 根据 this 的英语语法,很容易将函数中出现的  ...

  10. PHP5中使用PDO连接数据库

    PDO  如何连接 new PDO("mysql:host=localhost;dbname=php100","root", “ "); 默认这个不是 ...