博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1603 Square Destroyer
阅读量:7113 次
发布时间:2019-06-28

本文共 1746 字,大约阅读时间需要 5 分钟。

题意:

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

思路:

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 
#include
#include
#include
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
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<

转载于:https://www.cnblogs.com/137033036-wjl/p/4871061.html

你可能感兴趣的文章
Javascript 笔记与总结(2-16)事件对象
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.4.7
查看>>
JAVA存取对象属性时,如果开程多线程,记得对相关存取方法作原子化操作定义...
查看>>
深度学习 vs. 概率图模型 vs. 逻辑学
查看>>
Eclipse中使用javap运行配置详解
查看>>
DHCP租约时间工作原理
查看>>
Qt移动应用开发(六):QML与C++互动
查看>>
svn代码统计工具的金额
查看>>
2015第32周三
查看>>
Codeforces 56D Changing a String 编辑距离 记忆dp
查看>>
Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解...
查看>>
Android应用Design Support Library完全使用实例
查看>>
中通打印助手-实现快递面单快速打印(免费使用)
查看>>
付款页面DEMO
查看>>
Swift - 使用Core Data进行数据持久化存储
查看>>
[转载]服务器和应用系统迁移方案
查看>>
类的专有方法(__init__)
查看>>
open()系统调用的实现
查看>>
java历史集合类对比
查看>>
Java实现字符全阵列阵列
查看>>