题意:有一个由火柴棍组成的正方形网格,每条边有n根火柴,共2n(n+1)根。从上到下、从左到右给各个火柴编号。现在拿走一下火柴,问剩下的火柴中,至少还要拿走多少根火柴才能破坏正方形。

分析:列举每种可能,显然是回溯,思想就是每次考虑一个没有被破坏的正方形,都被破坏就退出并更新当前最优解,就是深度。这题难点就是如何表示正方形,先将所有正方形枚举出来,将它的四条边存入数组,而它边的表示可以算出来。

作者代码中有很多巧妙之处,细细体会收获很大,比如正方形的边存入。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#include<iostream>
#include<vector>
#include<list>
#include<set>
using namespace std;
const int maxn = 100;int n;
int existedge[maxn];
int contain[maxn][maxn];
int cursize[maxn],fullsize[maxn];
int allsquare = 0; int curbest;
inline int row_match(int x, int y) {return (2 * n + 1)*x + y;
}
inline int col_match(int x, int y) {return  (2 * n + 1)*x + n+y;
}
void init() {int m,v;cin >> n>>m;for (int i = 0; i < 2 * n*(n + 1); i++)existedge[i] = 1;for (int i = 0; i < m; i++) {cin >> v;existedge[v-1] = 0;}memset(contain, 0, sizeof(contain));allsquare = 0;for (int i = 1; i <= n; i++) {//枚举 边的数量for (int x = 0; x <= n-i; x++) {for (int y = 0; y <= n-i; y++) {cursize[allsquare] = 0;fullsize[allsquare] = 4 * i;//期望边数for (int e = 0; e < i; e++) {int a = row_match(x, y+e);//上边int b = row_match(x + i, y+e);//下边int c = col_match(x+e, y);//左边int d = col_match(x+e, y +i);//右边cursize[allsquare] += existedge[a] + existedge[b] + existedge[c] + existedge[d];//实际边数contain[allsquare][a] = 1;contain[allsquare][b] = 1;contain[allsquare][c] = 1;contain[allsquare][d] = 1;}++allsquare;}}}
}
int findsquare() {//找到未被破坏的正方形for (int i = 0; i < allsquare; i++) {if (cursize[i] == fullsize[i]) {return i;}}return -1;
}
void dfs(int cur) {if (cur >= curbest)return;//比当前最优值大,剪枝int k = findsquare();if (k == -1) {//没有完整正方体curbest = cur;return;}for (int i = 0; i < 2 * n*(n + 1); i++) {if (contain[k][i]) {for (int j = 0; j < allsquare; j++) {if (contain[j][i]) {//找与它相邻边的正方形cursize[j]--;//包含本身}                           //这里回溯之所以不考虑contain[j][i],不置0,是因为它少一条边之后就是破坏正方形,下次搜索不到}dfs(cur + 1);for (int j = 0; j < allsquare; j++) {if (contain[j][i]) {cursize[j]++;//包含本身}}}}}
int main() {int kase = 0;cin >> kase;while (kase-- > 0) {init();curbest = n * n;dfs(0);cout << curbest << endl;}//system("pause");return 0;
}

UVA1603Square Destroyer破坏正方形相关推荐

  1. 《算法艺术与信息学竞赛》题目-提交方式对照表 [转]

    id   title how2submit source page 1   盒子里的气球     8 2   图书馆 ural1188   9 3   钓鱼 uva757 pas 13 4   照亮的 ...

  2. 7.7 竞赛题目选讲

    7.7 竞赛题目选讲 题目可能有些难,请阅读完前面的篇章后,选择是否进行阅读. 7-11 宝箱 (UVA 12325) 你有一个体积为N的箱子和两种数量无限的宝物.宝物1的体积为S1,价值为V1:宝物 ...

  3. Square Destroyer UVA - 1603 IDA*

    紫书的代码 写起来很麻烦 以后自己独立再写. 把完整图里面的正发形都枚举出来,算出每一个正方形是否差了边 然后ida*一直搜就好了    有意思的是 ida*的maxd是放在dfs()里面实现的 内附 ...

  4. 中国顶级黑客45秒使用声音来破坏您的计算机

    近日,中国知名黑客教父,网络安全专家,东方联盟始创人郭盛华已经表明,您的文件可能会被声音损坏.那里已经有黑客窃取了破坏性的恶意软件,可以清除硬盘中的文件. 硬盘是一件奇迹般的事情,能够在极小的空间内存 ...

  5. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  6. P2216 理想的正方形 单调队列 (二维)

    题目链接:https://www.luogu.org/problem/P2216 题意:求给定n*m的矩形中所有k*k的正方形块中最大值最小值之差(极差)最小 哇,大神的思路真的很帅 单调队列对每一行 ...

  7. UE5废墟破坏游戏场景创建学习教程

    为游戏创建毁坏的资产–深入教程课程 了解一个专业的环境艺术家在为游戏创建毁坏的资产时是如何工作的.您将学习正确的资产规划.创建模块化资产.创建损坏的混凝土和柱子.创建损坏的木材/地板.创建碎石堆.模拟 ...

  8. opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...

    平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...

  9. linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...

    2012-02-05 wcdj 1, 调试时必需的栈知识 2, 数组非法访问导致内存破坏 调试时必需的栈知识 栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First ...

最新文章

  1. 阿里财报:盒马和天猫超市是跑的最快的业务,阿里云离盈利只差临门一脚
  2. 效率提升多倍, 推荐值得收藏40 个命令总结
  3. Mysql 5.7 json
  4. Tomcat 总体结构
  5. 光纤测试时不得不用的福禄克CFP光纤测试仪
  6. uva 12442 . Forwarding Emails
  7. python autoit获取网页ajax数据_WebDriver + Python 调用AutoIt例子(实现139邮箱写信页的附件上传)...
  8. unity捕捉全景图_DronePan:可捕捉飞机全景的应用程序
  9. 拳王虚拟项目公社:闲鱼操作卖资源如何赚钱?闲鱼怎么卖虚拟资源?卖什么资源赚钱?
  10. c语言银行系统个人心得,c,,银行管理实验报告心得体会.docx
  11. fiddler使用详细教程
  12. 基于java springboot博客管理系统设计和实现
  13. BIG5编码, GB编码(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char 说明与区别
  14. 大数据第三季--zk(day1)-徐培成-专题视频课程
  15. 自动控制原理学习--奈奎斯特稳定判据
  16. 外包的水有多深?华为15k+的外包测试岗能去吗?
  17. Prometheus Operator开始
  18. IDEA上tomcat日志输出乱码 淇℃伅 鏈嶅姟鍣ㄧ増鏈彿(锛 解决办法
  19. 企查查如何在线查询失信企业?
  20. spyder中安装第三方库的包

热门文章

  1. 为什么需要实现幂等性?
  2. 经典问题:微服务和分布式的区别
  3. Spring 中的代理选择原则
  4. Function接口练习之按照指定要求操作数据
  5. SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)
  6. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
  7. if语句和缩进部分是一个完整的代码块
  8. Spring Boot定时任务-SpringBoot整合Quartz
  9. ElasticSearch 简介,概念和集成
  10. 图片去字工具_这些免费工具轻松提取图片中的文字,别再傻傻地手工去输了