UVA 11214 Guarding the Chessboard 守卫棋盘(迭代加深+剪枝)
暴力,和八皇后很像,用表示i+j和i-j标记主对角线,但是还是要加一些的剪枝的。
1.最裸的暴搜
6.420s,差点超时
2.之前位置放过的就没必要在放了,每次从上一次放的位置开始放
0.400s
#include<cstdio>
#include<cstring> const int maxn = ;
char G[maxn][maxn];
int maxd;
int n,m;
bool visi[maxn],visj[maxn],vis1[maxn<<],vis2[maxn<<]; bool dfs(int d,int si,int sj)
{
if(d == maxd){
for(int i = ; i < n; i++)
for(int j = ; j < m; j++){
if(G[i][j] == 'X'&&!visi[i]&&!visj[j]&&!vis1[i+j]&&!vis2[i-j+])
return false;
}
return true;
}
for(int i = si; i < n; i++){
for(int j = (i == si?sj:); j < m; j++)
if(!visi[i] || !visj[j] || !vis1[i+j]|| !vis2[i-j+]){
bool f1 = visi[i], f2 = visj[j], f3 = vis1[i+j], f4 = vis2[i-j+];
visi[i] = visj[j] = vis1[i+j] = vis2[i-j+] = true;
if(dfs(d+,i,j))return true;
visi[i] = f1; visj[j] = f2; vis1[i+j] = f3; vis2[i-j+] = f4;
} }
return false;
} int main()
{
int cas = ;
while(scanf("%d%d",&n,&m),n){
for(int i = ;i < n; i++) scanf("%s",G[i]);
for(maxd = ; maxd < ; maxd++){
memset(visi,,sizeof(visi));
memset(visj,,sizeof(visj));
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if(dfs(,,))break;
}
printf("Case %d: %d\n",++cas,maxd);
}
return ;
}
第一种剪枝
3.可以逐行(或逐列)放置。还有一个剪枝就是最多放5个,所以maxd==4还没有解,直接输出5.
0.201s
#include<cstdio>
#include<cstring> const int maxn = ;
char G[maxn][maxn];
int maxd;
int n,m;
bool visi[maxn],visj[maxn],vis1[maxn<<],vis2[maxn<<]; bool dfs(int d,int si)
{
if(d == maxd){
for(int i = ; i < n; i++)
for(int j = ; j < m; j++){
if(G[i][j] == 'X'&&!visi[i]&&!visj[j]&&!vis1[i+j]&&!vis2[i-j+])
return false;
}
return true;
}
for(int i = si; i < n; i++){
for(int j = ; j < m; j++)
if(!visi[i] || !visj[j] || !vis1[i+j]|| !vis2[i-j+]){
bool f1 = visi[i], f2 = visj[j], f3 = vis1[i+j], f4 = vis2[i-j+];
visi[i] = visj[j] = vis1[i+j] = vis2[i-j+] = true;
if(dfs(d+,i+))return true;
visi[i] = f1; visj[j] = f2; vis1[i+j] = f3; vis2[i-j+] = f4;
} }
return false;
} int main()
{
int cas = ;
while(scanf("%d%d",&n,&m),n){
for(int i = ;i < n; i++) scanf("%s",G[i]);
for(maxd = ; maxd < ; maxd++){
memset(visi,,sizeof(visi));
memset(visj,,sizeof(visj));
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if(dfs(,))break;
}
printf("Case %d: %d\n",++cas,maxd);
}
return ;
}
UVA 11214 Guarding the Chessboard 守卫棋盘(迭代加深+剪枝)的更多相关文章
- UVA - 11214 Guarding the Chessboard(守卫棋盘)(迭代加深搜索)
题意:输入一个n*m棋盘(n,m<10),某些格子有标记.用最少的皇后守卫(即占据或者攻击)所有带标记的格子. 分析:因为不知道放几个皇后可以守卫所有带标记的格子,即回溯法求解时解答树的深度没有 ...
- UVA - 11214 Guarding the Chessboard(迭代加深搜索)
题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...
- UVA 11214 Guarding the Chessboard
题意: 皇后防御的范围是他所在横.竖.对角线,地图上的#为可以放旗子的地方.问最少放几个皇后能防守所有#. 分析: vis数组开4维,对应行.列.主对角线.副对角线 代码: #include < ...
- UVA - 11214 Guarding the Chessboard (可重复覆盖,DLX+IDA*)
题目链接 正解是IDA*+四个方向判重,但由于是个裸的可重复覆盖问题,可以用DLX水过~ 每个格子与放上皇后能干掉的标记连边,跑可重复覆盖DLX.注意要用IDA*来优化,否则会超时. #include ...
- UVA 10160 Servicing Stations(状态压缩+迭代加深)
[题目链接] LInk [题目大意] 给出一些点和边,选择一个点就能把这个点和相邻的点都覆盖,求最小点覆盖 [题解] 我们压缩点被覆盖的状态,迭代加深搜索覆盖的最小点数, 当剩余的点全部选上时都无法完 ...
- UVA-11214 Guarding the Chessboard (迭代加深搜索)
题目大意:在一个国际象棋盘上放置皇后,使得目标全部被占领,求最少的皇后个数. 题目分析:迭代加深搜索,否则超时. 小技巧:用vis[0][r].vis[1][c].vis[2][r+c].vis[c- ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- Power Calculus UVA - 1374 迭代加深搜索
迭代加深搜索经典题目,好久不做迭代加深搜索题目,拿来复习了,我们直接对当前深度进行搜索,注意剪枝,还有数组要适当开大,因为2^maxd可能很大 题目:题目链接 AC代码: #include <i ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
随机推荐
- POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)
Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...
- qemu编译
符号说明 $ 表示在用户模式下执行命令 # 表示在root模式下执行命令 ### 表示注释用于解释接下来一条命令的作用 更新环境源 设置阿里源 $ sudo mv /etc/yum.repos.d/C ...
- Jmeter接口自动化参数化 (转自软件测试部落)
测试场景: 有个查询城市(大概一百个 )天气预报的接口(需求参考第一课),需要根据不同的citycode,去查询对应城市的天气预报,这种接口该如何去测试呢? 分析需求: 不管是功能测试需求,还是接口测 ...
- Python学习笔记(迭代,列表解析,生成器)
迭代(iterable):支持每次返回自己所包含一个对象的 iter()得到迭代器,.next()遍历列表. 列表解析:根据已有列表高效生成列表的方式. 生成器(Generator): 通过列表生成式 ...
- axios发送两次请求原因及解决方法
axios发送两次请求原因及解决方法 最近Vue项目中使用axios组件,在页面交互中发现axios会发送两次请求,一种请求方式为OPTIONS,另外一种为自己设置的. 如图: 什么是CORS通信? ...
- SonarQube总结
官网:https://www.sonarqube.org/ 一款代码质量管理开源平台.
- [Android]简略的Android消息机制源码分析
相关源码 framework/base/core/java/andorid/os/Handler.java framework/base/core/java/andorid/os/Looper.jav ...
- HDU-2767-ProvingEquivalences
链接:https://vjudge.net/problem/HDU-2767 题意: 给一个图,求最少需要几条边将其连成一个强连通图 思路: tarjan,缩点,考虑缩点后的图,出度为0的点和入度为0 ...
- UVaLive6443(线段树)
要点 题意--题意往往是个大坎Orz:输入操作 p 则在区间\([x_1,x_2]\)插入一个三次函数, t 则先查询区间\([x_1,x_2]\)的函数值的和,然后按题目要求得到新的\(x_1\). ...
- python 4学习 list 和 tuple
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...