HDU 4462Scaring the Birds(枚举所有状态)
Scaring the Birds
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1257 Accepted Submission(s): 420
Farmer John plants a lot of corn. There are many birds living around his corn field. These birds keep stealing his corn all the time. John can't stand with that any more. He decides to put some scarecrows in the field to drive the birds away.
John's field can be considered as an N×N grid which has N×N intersections. John plants his corn on every intersection at first. But as time goes by, some corn were destroyed by rats or birds so some vacant intersections were left. Now John wants to put scarecrows on those vacant intersections and he can put at most one scarecrow on one intersection. Because of the landform and the different height of corn, every vacant intersections has a scaring range R meaning that if John put a scarecrow on it, the scarecrow can only scare the birds inside the range of manhattan distance R from the intersection.

The figure above shows a 7×7 field. Assuming that the scaring range of vacant intersection (4,2) is 2, then the corn on the marked intersections can be protected by a scarecrow put on intersection (4,2).
Now John wants to figure out at least how many scarecrows he must buy to protect all his corn.
For each test case:
The first line is an integer N ( 2 <= N <= 50 ) meaning that John's field is an N×N grid.
The second line is an integer K ( 0<= K <= 10) meaning that there are K vacant intersections on which John can put a scarecrow.
The third line describes the position of K vacant intersections, in the format of r
1,c
1,r
2,c
2 …. r
K,c
k . (r
i,c
i) is the position of the i-th intersection and 1 <= r
1,c
1,r
2,c
2…. r
K,c
k <= N.
The forth line gives the scaring range of all vacant intersections, in the format of R
1,R
2…R
K and 0 <= R
1,R
2…R
K <= 2 × N.
The input ends with N = 0.
2
2 2 3 3
1 3
4
2
2 2 3 3
1 4
0
1
题目大意:给你一张地图,然后有n个地点是空的用来放稻草人,其它的都是田地,每个稻草人位置有自己的横纵坐标以及可以保护田地的"半径"fabs(x-a)+fabs(y-b)<=r。问你找最少的稻草人使得所有田地被保护。
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
int n,p,res; //p指的是有多少个空地可以放稻草人
int visi[55][55];
int vis[12]; //点访问的情况
int num; //记录用了多少点
struct mq
{
int x;
int y;
int r;
};
mq node[12]; void init()
{
memset(visi,0,sizeof(visi));
memset(vis,0,sizeof(vis));
for(int i=0;i<p;i++)
visi[node[i].x][node[i].y]=1;
} void fun()
{
int j,k,ra,rb,ca,cb;
num=0;
for(int i=0;i<p;i++)
{
if(vis[i])
{
num++;
ra=node[i].x-node[i].r;
rb=node[i].x+node[i].r;
ca=node[i].y-node[i].r;
cb=node[i].y+node[i].r;
if(ra<1) ra=1;
if(rb>n) rb=n;
if(ca<1) ca=1;
if(cb>n) cb=n;
for(j=ra;j<=rb;j++)
for(k=ca;k<=cb;k++)
if(abs(j-node[i].x)+abs(k-node[i].y)<=node[i].r) //范围之类
visi[j][k]=1;
}
}
} int over() //是否全部覆盖
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
if(!visi[i][j])
{
return 0;
}
}
return 1;
} void solve()
{
int i,j;
res=100;
for(i=0;i<(1<<p);i++) //枚举所有的状态
{
init();
int tmp=i;
for(j=0;j<p;j++)
{
vis[j]=tmp&1; //刚好二进制是这样存储,唯一! 所有枚举子集
tmp>>=1;
//cout<<vis[j]<<" ";
}
//cout<<endl;
fun();
if(over()) //可以覆盖了
res=min(res,num);
}
}
int main()
{
int i;
while(scanf("%d",&n)&&n)
{
scanf("%d",&p);
for(i=0; i<p; i++)
scanf("%d%d",&node[i].x,&node[i].y);
for(i=0; i<p; i++)
scanf("%d",&node[i].r);
init();
if(over()) //说明不需要稻草人。。。
{
puts("0");
continue;
}
solve();
if(res==100) puts("-1"); //说明覆盖不了
else printf("%d\n",res);
}
return 0;
} //31MS
HDU 4462Scaring the Birds(枚举所有状态)的更多相关文章
- hdu 4057 AC自己主动机+状态压缩dp
http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...
- HDU 6607 Time To Get Up(状态压缩+枚举)
题目网址: http://acm.hdu.edu.cn/showproblem.php?pid=6077 思路: 先预处理一下,将每个数字块的“X”看作1,“.”看作0,进行状态压缩转换成二进制数,用 ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- Effective Objective-C 2.0 — 第五条用枚举表示状态、选项、状态码 (未看完)
枚举是一种常量命名方式.某个对象所经历的各种状态就可以定义为一个简单的枚举集.(enumeration set) 编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1.实现枚举所用的数据类型取决 ...
- hdu 5067 Harry And Dig Machine (状态压缩dp)
题目链接 bc上的一道题,刚开始想用这个方法做的,因为刚刚做了一个类似的题,但是想到这只是bc的第二题, 以为用bfs水一下就过去了,结果MLE了,因为bfs的队列里的状态太多了,耗内存太厉害. 题意 ...
- HDU 5778 abs (枚举)
abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- HDU 5724 Chess(SG函数+状态压缩)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5724 题意: 现在有一个n*20的棋盘,上面有一些棋子,双方每次可以选择一个棋子把它移动到其右边第一 ...
- HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)
题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...
随机推荐
- c++的内存分配
C++堆和栈的分配 腾讯.金山笔试常考 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈. 堆区(heap) — 一般由程序员分配释放, ...
- gsm at 指令
一.一般命令 AT+CGMI 给出模块厂商的标识. SONY ERICSSON AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM900,DCS1800或PCS1900).当模块有多频带 ...
- jackson2.1.4 序列化 通过给定Class映射 与抽象类的映射
//如果已知想要序列化的类型 可以使用TypeReference来进行处理 //List<MyBean> result = mapper.readValue(src, new TypeRe ...
- 如何打一手好Log
如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...
- Yarn NodeManager restart
一.介绍默认Yarn NodeManager重启后会断开所有当前正在运行的container的状态,这意味着重启后需要重新启动container进程,该特性的作用就是把NM的状态临时保存到本地,重启后 ...
- iOS开发小技巧--取消按钮的选中状态
首先要自定义按钮,并且实现如下方法,对,就是这么实现!!
- navicat导入csv
1.navicat for mysql 导入csv时出错,主要是由于csv中包含汉字所致: 2.解决办法为再host新连接时,选择高级,然后在编码菜单里选择20936 (Simplified Chin ...
- 【学习笔记】jQuery中的动画与效果
1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback]) 返回值: ...
- Linux之查看文件大小和数目
1.查看当前文件大小du -sh ./ du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=< ...
- DOM编程 学习笔记(一)
PS:虽然自己JS基本语法算是掌握了,但是其实在JS掌握的只是远远还不够,网页上有太多好看的动态效果都是用JS 做出来的,自己也就仅仅会那么一两个动态的效果,学的只是皮毛...等有空的时候一定要好好的 ...