https://vjudge.net/problem/UVA-1603

题意:有一个火柴棍组成的正方形网格,计算至少要拿走多少根火柴才能破坏所有正方形。

思路:从边长为1的正方形开始遍历,将正方形的边长和它的实际火柴数保存起来。之后dfs搜索。

#include<iostream>
#include<cstring>
using namespace std; const int maxn = ; int n, m,best,s;
int map[maxn],size[maxn],fullsize[maxn];
int contins[maxn][maxn]; int row_match(int x, int y) //行
{
return ( * n + )*x + y;
} int col_match(int x, int y) //列
{
return ( * n + )*x + n + y;
} int edges() //计算火柴根数
{
return *n*(n + );
} void init()
{
int ans;
cin >> n >> m;
//初始化网格
for (int i = ; i < edges(); i++)
map[i] = ;
while (m--)
{
cin >> ans;
map[ans - ] = ;
}
s = ; //s用来为正方形编号
memset(contins, , sizeof(contins));
for (int i = ; i <= n;i++) //正方形的边长,从1开始到n
for (int x = ; x <= n - i;x++) //正方形左上角的x坐标
for (int y = ; y <= n - i; y++) //正方形左上角的y坐标
{
size[s] = ;
fullsize[s] = * i; //第s个正方形的边长
//cout << fullsize[s] << "*" << endl;
for (int j = ; j < i; j++)
{
int a = row_match(x, y + j);
int b = row_match(x + i, y + j);
int c = col_match(x + j, y);
int d = col_match(x + j, y + i);
contins[s][a] = ; //储存正方形的边
contins[s][b] = ;
contins[s][c] = ;
contins[s][d] = ;
size[s] += map[a] + map[b] + map[c] + map[d];
}
s++;
}
} int find_sqware()
{
for (int i = ; i < s;i++)
if (fullsize[i] == size[i]) return i; //找到未被破坏的正方形
return -;
} void dfs(int dep)
{
if (dep >= best) return;
int k = find_sqware();
if (k == -) //每个正方形都已经被破坏
{
best = dep;
return;
}
for (int i = ; i < edges(); i++)
{
if (contins[k][i])
{
for (int j = ; j < s;j++)
if (contins[j][i]) size[j]--; //破坏,边的数量减少
dfs(dep + );
for (int j = ; j < s;j++) //回溯
if (contins[j][i]) size[j]++;
}
}
}
int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
init();
best = n*n;
dfs();
cout << best << endl;
}
return ;
}

UVa 1603 破坏正方形的更多相关文章

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

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

  2. 破坏正方形UVA1603

    题目大意 有一个由火柴棍组成的边长为n的正方形网格,每条边有n根火柴,共2n(n+1)根火柴.从上至下,从左到右给每个火柴编号,现在拿走一些火柴,问在剩下的后拆当中ongoing,至少还要拿走多少根火 ...

  3. UVA 11520 填充正方形

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

  4. UVA 1603 Square Destroyer

    题意: 给定一个火柴棒拼成的方格阵,然后去掉一些火柴棒,问至少再去掉几根火柴棒能够让图中一个正方形都没有. 思路: 1. 由于题目中给定了 n 的范围,2 * n * (n + 1) <= 60 ...

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

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

  6. IDA*

    模拟退火 基本思路(Main Thoughts): IDA*是一种优秀的搜索法,在一般的实际问题中,它比普通的搜索更快. 通过迭代加深和估价函数剪枝来搜索. 通常处理没有层数上界或上界很多大的搜索. ...

  7. UVA - 12113 Overlapping Squares(重叠的正方形)

    题意:给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出指定的形状. 分析:2*2的纸在4*4的棋盘上总共有9种放置位置,枚举所有的放置位置即可.枚举情况总共种. #p ...

  8. UVA - 1643 Angle and Squares (角度和正方形)(几何)

    题意:第一象限里有一个角,把n(n <= 10)个给定边长的正方形摆在这个角里(角度任意),使得阴影部分面积尽量大. 分析:当n个正方形的对角线在一条直线上时,阴影部分面积最大. 1.通过给定的 ...

  9. UVa 11520 Fill the Square 填充正方形

    在一个 n * n 网格中填了一些大写字母,你的任务是把剩下的格子中也填满大写字母,使得任意两个相邻格子(即有公共边的格子)中的字母不同.如果有多重填法,则要求按照从上到下,从左到右的顺序把所有格子连 ...

随机推荐

  1. ext3日志模式

    ext3日志模式 http://blog.sina.com.cn/s/blog_5d4ab4b40100dosx.html ext3支持多种日志模式 ext3 是ext2文件系统的高一级版本,完全兼容 ...

  2. find the safest road(弗洛伊德)

    http://acm.hdu.edu.cn/showproblem.php?pid=1596 #include <iostream> #include <stdio.h> #i ...

  3. oj2892(字典树)

    一改时间以后WA了,我就知道这题是考字典树,可惜代码怎么也不会敲了,郁闷. #include <stdio.h>#include <string.h>#include < ...

  4. Java序列化总结

    什么是序列化? 序列化是将对象的状态信息转化为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后可以通过存储区中读取或反序列化对象的状态重新创建对象. 为什么要序 ...

  5. CentOS6.5安装HBase集群及多HMaster配置

    1.配置SSH免登录 请参考:http://www.cnblogs.com/hunttown/p/5470357.html 服务器配置: Hadoop-NN-01 主Hadoop-NN-02 备Had ...

  6. Selenium Webdriver——操作隐藏的元素(二)display属性

    有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...

  7. 删除排序数组中的重复数字 II

    题目连接 http://www.lintcode.com/zh-cn/problem/remove-duplicates-from-sorted-array-ii/ 题目大意 跟进“删除重复数字”: ...

  8. Redis 十分钟快速入门

    本教程是一个快速入门教程,所以Redis的命令只是简单介绍了几个常用的,如果有其他需求请求官网查看API 使用. 1. Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的ke ...

  9. linux locate

    locate命令查找文件比find速度快很多,locate是在linux下实现快速查找文件的工具.相应的windows下有everything功能也很强大. [root@wuzhigang lib]# ...

  10. jQuery delay() 方法

    定义和用法 delay() 方法对队列中的下一项的执行设置延迟. 语法 $(selector).delay(speed,queueName) 参数 描述 speed 可选.规定延迟的速度. 可能的值: ...