POJ 1084
WA了好久,第一次用重覆盖的模型做题。感觉这题有个陷阱,那就是当去掉某些边后,若因为这个边去掉而被破环的正方形还存在,那么就会造成覆盖不完全,WA.
所以,在去掉边后,必定有些正方形是不存在的,须重新计算。另外,计算一个正方形有哪些边也很困难。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int Maxn=100;
const int Maxr=100;
const int Maxnode=10000;
const int inf=(1<<30); bool vis[Maxn];
bool ls[Maxr][Maxn];
int L[Maxnode], R[Maxnode], D[Maxnode], U[Maxnode], C[Maxnode];
int S[Maxn], H[Maxr], size;
//²»ÐèÒªSÓò
void Link(int r, int c)
{
S[c]++; C[size]=c;
U[size]=U[c]; D[U[c]]=size;
D[size]=c; U[c]=size;
if(H[r]==-1) H[r]=L[size]=R[size]=size;
else {
L[size]=L[H[r]]; R[L[H[r]]]=size;
R[size]=H[r]; L[H[r]]=size;
}
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;
}
int h(){ //Óþ«È·¸²¸ÇÈ¥¹ÀËã¼ôÖ¦
int ret=0;
bool vist[Maxn];
memset (vist, false, sizeof(vist));
for (int i=R[0]; i; i=R[i])
{
if(vist[i])continue;
ret++;
vist[i]=true;
for (int j=D[i]; j!=i; j=D[j])
for (int k=R[j]; k!=j; k=R[k])
vist[C[k]]=true;
}
return ret;
} int ans;
void Dance(int k){ //¸ù¾Ý¾ßÌåÎÊÌâÑ¡ÔñÏÞÖÆËÑË÷Éî¶È»òÖ±½ÓÇó½â¡£
if(k+h()>=ans) return;
if(!R[0]){
if(k<ans)ans=k;
return;
}
int c=R[0];
for (int i=R[0]; i; 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);
Dance(k+1);
for (int j=L[i]; j!=i; j=L[j])
resume(j);
resume(i);
}
return ;
} void initL(int x){ //col is 1~x,row start from 1
for (int i=0; i<=x; ++i){
S[i]=0;
D[i]=U[i]=i;
L[i+1]=i; R[i]=i+1;
} //¶ÔÁбíÍ·³õʼ»¯
R[x]=0;
size=x+1; //ÕæÕýµÄÔªËØ´Óm+1¿ªÊ¼
memset (H, -1, sizeof(H));
ans=inf;
//markÿ¸öλÖõÄÃû×Ö
} bool check(int i,int j,int si,int n){
for(int k=0;k<si;k++){
if(vis[(i-1)*(2*n+1)+j+k]) return false;
if(vis[(i-1+si)*(2*n+1)+j+k]) return false;
if(vis[i*n+(i-1)*(n+1)+j+k*(2*n+1)]) return false;
if(vis[i*n+(i-1)*(n+1)+j+k*(2*n+1)+si]) return false;
}
return true;
} int main(){
int kase,n; int sof,tmp,tt,c;
scanf("%d",&kase);
while(kase--){
// sof=0;
scanf("%d",&n);
// initL(sof);
scanf("%d",&tt);
memset(vis,false,sizeof(vis));
for(int i=1;i<=tt;i++){
scanf("%d",&tmp);
vis[tmp]=true;
}
memset(ls,false,sizeof(ls));
c=1;
for(int si=1;si<=n;si++){
for(int i=1;i<=n-si+1;i++){
for(int j=1;j<=n-si+1;j++){
if(check(i,j,si,n)){
for(int k=0;k<si;k++){
ls[(i-1)*(2*n+1)+j+k][c]=true;
ls[(i-1+si)*(2*n+1)+j+k][c]=true;
ls[i*n+(i-1)*(n+1)+j+k*(2*n+1)][c]=true;
ls[i*n+(i-1)*(n+1)+j+k*(2*n+1)+si][c]=true;
}
c++;
}
}
}
}
initL(c-1);
for(int i=1;i<=2*(n)*(n+1);i++){
for(int j=1;j<c;j++)
if(ls[i][j])
Link(i,j);
}
Dance(0);
printf("%d\n",ans);
}
return 0;
}
POJ 1084的更多相关文章
- 【POJ 1084】 Square Destroyer
[题目链接] http://poj.org/problem?id=1084 [算法] 迭代加深 [代码] #include <algorithm> #include <bitset& ...
- poj 1084 舞蹈链(纠结题)
此题反正我自己是认为poj给的数据范围是有错的,不知道是不是自己太弱了,有大神在的话,欢迎来呸! 其实目的就在于建图,搞的我后来建了一个无比纠结的图,先建立了火柴棍和正方形的一个全图,然后再删除一些火 ...
- poj 1084 Brainman(归并排序)
题目链接:http://poj.org/problem?id=1804 思路分析:序列的逆序数即为交换次数,所以求出该序列的逆序数即可. 根据分治法思想,序列分为两个大小相等的两部分,分别求子序列的逆 ...
- (中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。
Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The ...
- [DLX反复覆盖] poj 1084 Square Destroyer
题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么当中会有非常多诸如边长为1,为2...为n的正方形,如今能够拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些 ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
- Dancing Links [Kuangbin带你飞] 模版及题解
学习资料: http://www.cnblogs.com/grenet/p/3145800.html http://blog.csdn.net/mu399/article/details/762786 ...
- Dancing Link专题
一些链接: http://www.cnblogs.com/-sunshine/p/3358922.html http://www.cnblogs.com/grenet/p/3145800.html 1 ...
随机推荐
- B1231 [Usaco2008 Nov]mixup2 混乱的奶牛 状压dp
发现是状压dp,但是还是不会...之前都白学了,本蒟蒻怎么这么菜,怎么都学不会啊... 其实我位运算基础太差了,所以状压学的不好. 题干: Description 混乱的奶牛 [Don Piele, ...
- bzoj1179 [Apio2009]Atm——缩环最长路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 tarjan 缩环,然后求到有酒吧的点的最长路即可: 但一开始想缩环后用拓扑序求答案, ...
- 比较两个map里的数据
template <class DataType>void ProcessMap(std::map<std::string, std::vector<DataType> ...
- 快速排序及三向切分快排——java实现
快速排序也是一种分治算法.主要思想是选取一个切分点,将大于切分点的元素都放置到数组右侧,小于切分点的元素都放置到数组左侧:然后递归,再对切分点左侧和右侧分别排序. 归并排序时递归在前,归并在后,快速排 ...
- [Apple开发者帐户帮助]六、配置应用服务(1.2)Apple Pay:在网络上配置Apple Pay
网上Apple Pay允许用户在您的网络应用中购买商品和服务. 首先在您的开发者帐户中创建一个商家标识符,该标识符可以将Apple Pay唯一标识为能够接受付款的商家.您可以为多个本机和Web应用程序 ...
- C# 标准命名规范
笔者从事开发多年,有这样一种感觉,查看一些开源项目,如Spring.Apache Common等源码是一件赏心悦目的事情,究其原因,无外两点:1)代码质量非常高:2)命名特别规范(这可能跟老外的英语水 ...
- java 实现yaml 数据转json与map
首先引入snakeyaml-1.16.jar的包. 直接上代码: package com.ming.yaml; import java.util.Map; import org.yaml.snakey ...
- spring框架搭建(一)
spring介绍 spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架,它主要是为了解决企业应用开发复杂性而诞生的. 简单来说spring是一个一站式轻量级开源框架. IOC:In ...
- Centos7.5 在桌面创建AndroidStudio快捷方式
Centos7 在桌面创建AndroidStudio快捷方式 前言 最近安装了Centos7,打算将开发平台转移到Linux下,安装好AndroidStudio后,桌面没有快捷方式有些不习惯,随自己创 ...
- Power BI 入门资料
1.官方文档 Power BI Desktop:https://docs.microsoft.com/zh-cn/power-bi/desktop-getting-started Power BI 报 ...