题意:

  给定一个火柴棒拼成的方格阵,然后去掉一些火柴棒,问至少再去掉几根火柴棒能够让图中一个正方形都没有。

思路:

1. 由于题目中给定了 n 的范围,2 * n * (n + 1) <= 60 -> 所以能够保证所有的火柴用 long long的位运算表示;

2. 启发式函数 h 的计算需要考量:如果删除了某个方阵的一个边,则能够保证 h(s1) <= h(s2) + C(s1, s2),其中 C(s1, s2) = 1,h(s1) - h(s2) <= 1;

3. 各种位运算的范围要明确,如 1<<i 前面要加上long long 修饰方能得到正确的结果

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int INFS = 0x7fffffff;
int N,C,E,bound;
long long squ[100],xiao[6][6];
bool flag;
long long get2(int i)
{
return ((long long)1<<(i-1));
}
int getnumber1(int i,int j)
{
return (2*N+1)*(i-1)+j;
}
int getnumber2(int i,int j)
{
return (2*N+1)*(i-1)+j+N;
}
void build()
{
C=0;
memset(xiao,0,sizeof(xiao));
int i,j;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
xiao[i][j]|=get2(getnumber1(i,j))|get2(getnumber1(i+1,j));
xiao[i][j]|=get2(getnumber2(i,j))|get2(getnumber2(i,j+1));
squ[C++]=xiao[i][j];
}
for(int size=2;size<=N;size++)
{
for(i=1;i+size-1<=N;i++)
{
for(j=1;j+size-1<=N;j++)
{
squ[C]=0;
for(int a=0;a<size;a++)
{
for(int b=0;b<size;b++)
{
squ[C]^=xiao[i+a][j+b];;
}
}
C++;
}
}
}
}
int dfs(long long state,int de)
{
int h=0;
long long u=0,s=state;
for(int i=0;i<C;i++)
{
if((s&squ[i])==squ[i])
{
h+=1;
s^=squ[i];
if(u==0)
u=squ[i];
}
}
if(h==0)
{
flag=true;
return de;
}
if(de+h>bound)
return de+h;
int news=INFS;
for(int i=1;i<=E;i++)
{
if(u&get2(i))
{
int b=dfs(state^get2(i),de+1);
if(flag)
return b;
news=min(b,news);
}
}
return news;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&N);
build();
E=2*N*(N+1);
int k;
long long state=((long long)1<<E)-1;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
int x;
scanf("%d",&x);
state^=get2(x);
}
flag=false;
bound=0;
while(!flag)
{
bound=dfs(state,0);
}
printf("%d\n",bound);
}
}

UVA 1603 Square Destroyer的更多相关文章

  1. UVA - 1603 Square Destroyer (DLX可重复覆盖+IDA*)

    题目链接 给你一个n*n的由火柴组成的正方形网格,从中预先拿掉一些火柴,问至少还需要拿掉多少火柴才能破坏掉所有的正方形. 看到这道题,我第一反应就是——把每根火柴和它能破坏掉的正方形连边,不就是个裸的 ...

  2. UVA 11542 - Square(高斯消元)

    UVA 11542 - Square 题目链接 题意:给定一些数字.保证这些数字质因子不会超过500,求这些数字中选出几个,乘积为全然平方数,问有几种选法 思路:对每一个数字分解成质因子后.发现假设要 ...

  3. (中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。

    Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The ...

  4. UVa 11461 - Square Numbers【数学,暴力】

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  5. 7-15 Square Destroyer 破坏正方形 uva1603

    先是处理所有的正方形 从边长为1开始 将其边存好 满边存好 然后不断扫描正方形  并且进行拆除  直到拆完或者 步数小于等于9(启发方程  因为n小于等于5  九次足以将所有的拆完) 代码实施有很多细 ...

  6. UVA 11461 - Square Numbers 数学水题

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  7. xor方程组消元 UVA 11542 Square

    题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数.训练指南题目. 分析:每一个数字分解质因数.比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么,如果p是平方数 ...

  8. UVA 11461 - Square Numbers(水题)

    题目链接 #include <cstdio> #include <cstring> #include <string> #include <cmath> ...

  9. UVA 11461 - Square Numbers

    题目:统计区间中的平方数个数. 分析: ... #include <stdio.h> #include <string.h> ]; int main() { int i, a, ...

随机推荐

  1. UVa 1394: And Then There Was One

    设置一个数组Winner记录经典约瑟夫问题中的剩余者即可递归解决该问题. 注: 约瑟夫问题:有编号为0~n-1的n个人,从0号开始报数1,2,3......报到k的杀死,然后从下一个人开始继续报数1, ...

  2. ACdream OJ 1153 (k-GCD)

    题目链接: http://115.28.76.232/problem?pid=1153 题意: 从给定的n个数中取出k个数,使得他们的最大公约数最大,求这个最大的公约数 分析: 暴力分解不可取,我们能 ...

  3. C# 开机启动代码

     开机启动/关闭 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

  4. java-随学随记之基础篇

    一.Java是一门高级语言,具有跨平台性(一次编译到处运行) 1.javac.exe命令,编译器   javac 源文件名.java 2.java.exe命令,启动虚拟机 java 类名 二.环境变量 ...

  5. iOS FMDB

    FMDB FMDB概述 什么是FMDB * FMDB是iOS平台的SQLite数据库框架 * FMDB以OC的方式封装了SQLite的C语言API FMDB的优点 * 使用起来更加面向对象,省去了很多 ...

  6. oracle中的rowid和数据行的结构

    在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行 ...

  7. Light Bulb--zoj3203(三分法)

    Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...

  8. Android平台对H264视频硬解码

    本文讲述如何使用Android标准的API (MediaCodec)实现H264的硬件解码. 原本我们是用JNI调用平台提供的硬件解码接口得到YUV帧,再放入opengl脚本里处理渲染的.可是换了新平 ...

  9. NFC介绍

    简介 本文介绍Nokia设备所支持的近场通信技术(NFC)及相关的功能.旨在为使用 Qt/Symbian/Java™ API为Nokia手机开发应用的开发者 刚开始接触NFC开发时提供有用的信息. 什 ...

  10. Java GC 日志详解(转)

    Java GC日志可以通过 +PrintGCDetails开启 以ParallelGC为例 YoungGC日志解释如下(图片源地址:这里) : FullGC(图片源地址:这里): http://blo ...