Scaring the Birds dfs hdu-4462
题目链接:Problem - 4462
题面:
题意:一片n*n的农田,现在有k个地方的庄稼被鸟吃了,现在农夫想在这k个地方放稻草人,每个稻草人会保护曼哈顿距离为ri的农田,问最少需要几个稻草人能让剩下的庄稼不被吃,如果不行输出-1
思路:dfs,最多10个稻草人,枚举每种状态即可,被破坏了的地不用保护;
如果样例为
2
4
1 1 2 2 1 2 2 1
0 0 0 0
答案为0
保护的形状为菱形
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
int n;
int k;
int x[15], y[15];
bool s[55][55];
int z[15];
int ans = 15;
bool vis[55][55];
int cnt;
void dfs(int a, int b, int c){ //第几个稻草人,已经拿了几个稻草人,已经保护的面积大小if(a == k){return ;}dfs(a + 1, b, c); //不要这个稻草人的情况int xx = x[a];int yy = y[a];vector<pair<int, int>> ve;for(int i = 0; i <= z[a]; i++){for(int j = 0; j <= z[a] - i; j++){if(vis[xx][yy] == 0 && s[xx][yy] == 0){ve.push_back({xx, yy});vis[xx][yy] = 1;cnt++;}yy++;if(yy > n){break;}}xx++;if(xx > n){break;}yy = y[a];}xx = x[a];yy = y[a];for(int i = 0; i <= z[a]; i++){for(int j = 0; j <= z[a] - i; j++){if(vis[xx][yy] == 0 && s[xx][yy] == 0){ve.push_back({xx, yy});vis[xx][yy] = 1;cnt++;}yy--;if(yy == 0){break;}}xx++;if(xx > n){break;}yy = y[a];}xx = x[a];yy = y[a];for(int i = 0; i <= z[a]; i++){for(int j = 0; j <= z[a] - i; j++){if(vis[xx][yy] == 0 && s[xx][yy] == 0){ve.push_back({xx, yy});vis[xx][yy] = 1;cnt++;}yy ++;if(yy > n){break;}}xx--;if(xx == 0){break;}yy = y[a];}xx = x[a];yy = y[a];for(int i = 0; i <= z[a]; i++){for(int j = 0; j <= z[a] - i; j++){if(vis[xx][yy] == 0 && s[xx][yy] == 0){ve.push_back({xx, yy});vis[xx][yy] = 1;cnt++;}yy --;if(yy == 0){break;}}xx--;if(xx == 0){break;}yy = y[a];}if(c + ve.size() == n * n - k){ans = min(ans, b + 1);}else{dfs(a + 1, b + 1, c + ve.size());}for(int i = 0; i < ve.size(); i++){xx = ve[i].first;yy = ve[i].second;vis[xx][yy] = 0;}
}
int main(){ios::sync_with_stdio(false);while(cin >> n){if(n == 0){break;}cin >> k;memset(vis, 0, sizeof(vis));memset(s, 0, sizeof(s));for(int i = 0; i < k; i++){cin >> x[i] >> y[i];s[x[i]][y[i]] = 1;}for(int i = 0; i < k; i++){cin >> z[i];}if(n * n - k == 0){cout << 0 << endl;continue;}ans = 15;cnt = 0;dfs(0, 0, 0);if(ans == 15){ans = -1;}cout << ans << endl;}return 0;
}
Scaring the Birds dfs hdu-4462相关推荐
- hdu 5325 Crazy Bobo dfs
// hdu 5325 Crazy Bobo // // 题目大意: // // 给你一棵树,树上每一个节点都有一个权值w,选择尽可能多的节点, // 这些节点相互联通,而且依照权值升序排序之后得到节 ...
- hdu 4751(dfs染色)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751 思路:构建新图,对于那些两点连双向边的,忽略,然后其余的都连双向边,于是在新图中,连边的点是能不 ...
- HDU 1426 Sudoku Killer【DFS 数独】
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品 ...
- [HDU 1427]速度计算24点(DFS暴力搜索)
主题连接: http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路:简单的DFS.dfs(sum,next,p)表示当前已经算出的值是sum,括号里算 ...
- hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...
- hdu 5424(dfs搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5424 官方题解: 如果图是联通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点 ...
- hdu 4358(莫队算法+dfs序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4358 解题思路:用dfs求出整棵树的dfs序列,这样以u为根节点的子树就转化到相对应的区间上了.由于是 ...
- HDU(1572),最短路,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572 很久没写深搜了,有点忘了. #include <iostream> #include ...
- hdu 4714 树+DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 本来想直接求树的直径,再得出答案,后来发现是错的. 思路:任选一个点进行DFS,对于一棵以点u为 ...
最新文章
- 【原】iOS学习之Xcode8关于控制台不打印错误信息
- Spring Aop 日志管理及配置文件的详细配置
- ContentValues(Java)
- Leetcode987 二叉树的垂序遍历
- 设计模式学习之代理模式学习(一)
- IDEA突然自动关闭然后无法启动
- 统计数组中每个数字出现的次数_剑指Offer(二十八) 数组中次数出现超过一半的数字...
- file_table.c 文件分析 linux1_0\linux\fs\file_table.c
- Packet Tracer实验——使用三层交换机实现vlan间的通信(详解)
- 什么是压栈操作?指令:PUSH src ;src为16位操作数
- 人口增量超过北上广!二线城市是怎样逆袭的?
- 公开课精华 | 移动机器人视觉三维感知的现在与将来
- Unreal Engine 4 —— 多线程任务构建
- python颜色识别算法_纯Python编写K-means算法,提取图片中的主体颜色
- POJ-3264-Balanced Lineup
- 电脑显示器尺寸对照表_三分钟带你了解五花八门的显示器参数,买显示器不在跳坑...
- WKWebView详解
- html实现贪吃蛇游戏(源码)
- 轩逸android 苹果 蓝牙,【图】Iphone与轩逸车载蓝牙连接的小技巧
- execl筛选去重_excel表格如何去除重复数据进行筛选