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*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
随机推荐
- 附近wifi都是你的
今天给大家介绍deauth攻击. 最终效果:附近你指定的任何wifi,别人都无法连接,即便连接上的也会断掉. 由于我在 “世界虽大,但没有破不了的wifi” 这篇文章中写的很详细,所以我在这里就步详 ...
- Gym - 101611D Decoding of Varints(边界值处理)
Decoding of Varints Statements Varint is a type used to serializing integers using one or more bytes ...
- framework资源文件读取
1.在framework里面读framwork自己的资源文件 这是framework内部的资源,跟其他都没有关系.但是framework不能单独存在,必须要放在某个“主程序”中才能起作用.bundle ...
- 【原】:关于使用springmvc的responseBody注解返回json的一些总结
配置不正确可能会出现406错误 1:首先需要导入三个jar包: 2:需要在springmvc的配置文件文件中添加转换器并开启注解驱动: 3:controller:这里返回object也是可以的; 4: ...
- Maven修改默认仓库为阿里云仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库. 第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加 ...
- Python:asyncio模块学习
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...
- 洛谷P3110 [USACO14DEC]驮运Piggy Back
P3110 [USACO14DEC]驮运Piggy Back 题目描述 贝西和她的妹妹艾尔斯白天在不同的地方吃草,而在晚上他们都想回到谷仓休息.聪明的牛仔,他们想出了一个计划,以尽量减少他们在步行时花 ...
- ajax对象。同步与异步及ajax发送请求
ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了 ...
- 有关xerosploit运行报错问题的有效解决方案
[安装xerosploit]安装xerosploit的步骤如下,我是将xerosploit直接克隆到了根目录下(使用“cd /”到达根目录) git clone https://github.com/ ...
- thinkphp5部署到LAMP服务器显示Access denied.
问题:thinkphp5部署到LAMP服务器,首页正常访问,其余页面访问显示Access denied 解决:1.先把文件夹权限改为777 2. 进入服务器,改文件.将php.ini的值改成1