Square Destroyer-POJ 1084 (IDA*)
Description
Each matchstick of the complete grid is identified with a unique number which is assigned from left to right and from top to bottom as shown in the left figure. If you take some matchsticks out from the complete grid, then some squares in the grid will be destroyed, which results in an incomplete 3*3 grid. The right figure illustrates an incomplete 3*3 grid after removing three matchsticks numbered with 12, 17 and 23. This removal destroys 5 squares of size one, 3 squares of size two, and 1 square of size three. Consequently, the incomplete grid does not have squares of size three, but still has 4 squares of size one and 1 square of size two.

As input, you are given a (complete or incomplete) n*n grid made with no more than 2n(n+1) matchsticks for a natural number 5 <= n . Your task is to compute the minimum number of matchsticks taken
out to destroy all the squares existing in the input n*n grid.
Input
Each test case consists of two lines: The first line contains a natural number n , not greater than 5, which implies you are given a (complete or incomplete) n*n grid as input, and the second line begins with a nonnegative integer k , the number of matchsticks that are missing from the complete n*n grid, followed by
k numbers specifying the matchsticks. Note that if k is equal to zero, then the input grid is a complete n*n grid; otherwise, the input grid is an incomplete n*n grid such that the specified k matchsticks are missing from the complete n*n grid.
Output
Sample Input
2
2
0
3
3 12 17 23
Sample Output
3
3
题意:t组数据,给出n代表n*n的网格,给一个值k,然后k个值,表示去掉k所代表的边,问还需要最少去掉几条边可以使得网格中没有正方形。
思路:
评估函数:每出现一个正方形,就删去其含有的边,然后继续扫描正方形,这样计数出来的次数比实际需要次数小(因为一次删去了多条边)
对于网格中正方形的枚举:
①先枚举正方形大小,1 <= size <= n;
②枚举网格每行最左边的火柴

③对于每个行位置,枚举该行可以成为该size大小正方形的最左边火柴
④标记该正方形的所有上边界和下边界(知道size和上边界最左火柴很容易求得)
标记该正方形的所有左边界和有边界
(代码借鉴网上,侵删)
stick【i】表示含有i火柴的正方形编号
square【i】表示i正方形所含火柴编号
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std; int t;
int totsquare,totstick,base;
vector<int>stick[],square[];
int n,k;
int ans;
int exi[],tmp[]; int cal()
{
int res = ;
for(int i=;i<=totsquare;i++)tmp[i] = exi[i];
for(int i=;i<=totsquare;i++)if(!tmp[i])
{
res++;
for(int j=;j<square[i].size();j++)
{
for(int l=;l<stick[square[i][j]].size();l++)
{
tmp[stick[square[i][j]][l]]--;
}
}
}
return res;
} bool dfs(int sum,int lim)
{
if(sum + cal() > lim)return ;
int tmp = ;
while(exi[tmp] < && tmp <= totsquare)tmp++;
if(tmp > totsquare)
{
ans = min(ans,sum);
return ;
}
for(int i=;i<square[tmp].size();i++)
{
int sti = square[tmp][i];
for(int j=;j<stick[sti].size();j++)
{
exi[stick[sti][j]]--;
}
if(dfs(sum+,lim))return ;
for(int j=;j<stick[sti].size();j++)
{
exi[stick[sti][j]]++;
}
}
return ;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
totsquare = ,totstick = *n*(n+),base = *n+;
for(int i=; i<; i++)
{
stick[i].clear();
square[i].clear();
}
for(int sz=; sz<=n; sz++)
{
for(int i=; (i-)/base+sz<=n; i+=base)
{
for(int j=i; j-i+sz<=n; j++)
{
totsquare++;
for(int l=j; l-j<sz; l++) // 正方形上下边界标记
{
square[totsquare].push_back(l);
square[totsquare].push_back(l+sz*base);
stick[l].push_back(totsquare);
stick[l+sz*base].push_back(totsquare);
}
for(int l=j+n; (l-j-sz)/base<sz; l+=base) //正方形左右边界标记
{
square[totsquare].push_back(l);
square[totsquare].push_back(l+sz);
stick[l].push_back(totsquare);
stick[l+sz].push_back(totsquare);
}
}
}
}
memset(exi,,sizeof(exi));
for(int i=; i<=k; i++)
{
int t_st;
scanf("%d",&t_st);
for(int j=; j<stick[t_st].size(); j++)
{
exi[stick[t_st][j]]--;
}
totstick--;
}
ans = totstick;
for(int maxd=;; maxd++)
{
if(dfs(,maxd))
{
printf("%d\n",ans);
break;
}
}
}
}
Square Destroyer-POJ 1084 (IDA*)的更多相关文章
- Booksort POJ - 3460 (IDA*)
Description The Leiden University Library has millions of books. When a student wants to borrow a ce ...
- POJ题目(转)
http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法: (1)枚举. (poj1753,poj29 ...
- Repeater POJ - 3768 (分形)
Repeater POJ - 3768 Harmony is indispensible in our daily life and no one can live without it----may ...
- UVA - 10384 The Wall Pusher(推门游戏)(IDA*)
题意:从起点出发,可向东南西北4个方向走,如果前面没有墙则可走:如果前面只有一堵墙,则可将墙向前推一格,其余情况不可推动,且不能推动游戏区域边界上的墙.问走出迷宫的最少步数,输出任意一个移动序列. 分 ...
- Radar Installation POJ - 1328(贪心)
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...
- Best Cow Fences POJ - 2018 (二分)
Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains ...
- E - The Balance POJ - 2142 (欧几里德)
题意:有两种砝码m1, m2和一个物体G,m1的个数x1, m2的个数为x2, 问令x1+x2最小,并且将天平保持平衡 !输出 x1 和 x2 题解:这是欧几里德拓展的一个应用,欧几里德求不定方程 ...
- 人类即将进入互联网梦境时代(IDA)
在电影<盗梦空间>中,男主角科布和妻子在梦境中生活了50年,从楼宇.商铺.到河流浅滩.一草一木.这两位造梦师用意念建造了属于自己的梦境空间.你或许并不会想到,在不久未来,这看似科幻的情节将 ...
- POJ 2286 The Rotation Game(IDA*)
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 6396 Accepted: 21 ...
随机推荐
- 基于AD5663的UV灯电压控制
在开发臭氧发生器的时,我们使用UV灯来实现臭氧的产生.而UV灯的强度决定了臭氧产生的浓度,UV灯的光强则与其控制电压密切相关.所以我们要控制产生的臭氧的浓度就需要调节其控制电压.我们选择了AD5663 ...
- HTML中特殊符号的处理
一.写在前面 今天在写页面时记不清大/小于符号该怎么写,于是就想着整理一下方便后面用到! 二.HTML中常用特殊符号的处理 < < 小于号或显示标记 > ...
- Confluence 6 查看内容索引概要
内容索引,通常也被称为查找索引,这个索引被用来在 Confluence 中支持查找.这个索引同时也被其他的一些功能使用,例如在归档邮件中构建邮件主题,View Space Activity 的特性和将 ...
- Microsoft Graph 概述
这个系列文章 已经进行到了实质的阶段,继上一篇介绍了如何搭建Office 365开发环境之后,我会通过这篇文章给大家介绍一个非常重要的概念:Microsoft Graph.它之所以重要,首先是因为它是 ...
- ESD选型指南
信息来自网络,可能有误,希望指正! 一.ESD工作原理 ESD静电保护元件,又称静电抑制二极管.ESD是多个TVS晶粒或二极管采用不同的布局做成具有特定功能的多路或单路ESD保护器件,主要应用于各类通 ...
- 微信小程序开发 如何退出当前页面
默认是在首页 wx.navigateBack({ delta: -1 }); 详情参考. https://mp.weixin.qq.com/debug/wxadoc/dev/api/u ...
- 步步为营-84-数字转化为金额的Js+enter键取消页面刷新
说明:来不及细说了,老铁快上车 function fmoney(s, n) { console.log(s); n = n > && n <= ? n : ; s = pa ...
- 使用CSS选择器定位页面元素
摘录:http://blog.csdn.net/defectfinder/article/details/51734690 CSS选择器也是一个非常好用的定位元素的方法,甚至比Xpath强大.在自动化 ...
- jQuery常见案例
jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...
- Nancy 返回值详解
简介 Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono.它的返回值也是多种多样的,适应各种不同的情况.包括Response.AsFile( ...