暴力,和八皇后很像,用表示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 守卫棋盘(迭代加深+剪枝)的更多相关文章

  1. UVA - 11214 Guarding the Chessboard(守卫棋盘)(迭代加深搜索)

    题意:输入一个n*m棋盘(n,m<10),某些格子有标记.用最少的皇后守卫(即占据或者攻击)所有带标记的格子. 分析:因为不知道放几个皇后可以守卫所有带标记的格子,即回溯法求解时解答树的深度没有 ...

  2. UVA - 11214 Guarding the Chessboard(迭代加深搜索)

    题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...

  3. UVA 11214 Guarding the Chessboard

    题意: 皇后防御的范围是他所在横.竖.对角线,地图上的#为可以放旗子的地方.问最少放几个皇后能防守所有#. 分析: vis数组开4维,对应行.列.主对角线.副对角线 代码: #include < ...

  4. UVA - 11214 Guarding the Chessboard (可重复覆盖,DLX+IDA*)

    题目链接 正解是IDA*+四个方向判重,但由于是个裸的可重复覆盖问题,可以用DLX水过~ 每个格子与放上皇后能干掉的标记连边,跑可重复覆盖DLX.注意要用IDA*来优化,否则会超时. #include ...

  5. UVA 10160 Servicing Stations(状态压缩+迭代加深)

    [题目链接] LInk [题目大意] 给出一些点和边,选择一个点就能把这个点和相邻的点都覆盖,求最小点覆盖 [题解] 我们压缩点被覆盖的状态,迭代加深搜索覆盖的最小点数, 当剩余的点全部选上时都无法完 ...

  6. UVA-11214 Guarding the Chessboard (迭代加深搜索)

    题目大意:在一个国际象棋盘上放置皇后,使得目标全部被占领,求最少的皇后个数. 题目分析:迭代加深搜索,否则超时. 小技巧:用vis[0][r].vis[1][c].vis[2][r+c].vis[c- ...

  7. UVA 529 - Addition Chains,迭代加深搜索+剪枝

    Description An addition chain for n is an integer sequence  with the following four properties: a0 = ...

  8. Power Calculus UVA - 1374 迭代加深搜索

    迭代加深搜索经典题目,好久不做迭代加深搜索题目,拿来复习了,我们直接对当前深度进行搜索,注意剪枝,还有数组要适当开大,因为2^maxd可能很大 题目:题目链接 AC代码: #include <i ...

  9. uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索

    迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...

随机推荐

  1. Java socket异常

    Java socket异常 分类: Java 2013-07-15 22:38 981人阅读 评论(0) 收藏 举报 目录(?)[+] 使用Java socket编写程序时,通常会遇到几种种异常:Bi ...

  2. CodeForces - 1017D Round #502 D. The Wu(状压预处理)

    D. The Wu time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  3. MS SQL Server的LTRIM,RTRIM和TRIM函数

    在MS SQL Server 2017有了一个新函数TRIM,整合以前版本LTRIM和RTRIM. 这几个函数都是去除字符串头部后尾部的空格. DECLARE @str NVARCHAR(MAX) = ...

  4. 数据库路由中间件MyCat - 使用篇(3)下篇

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2. 配置conf/server.xml server.xml几乎保存了所有mycat需要的系统配置信息.其 ...

  5. vs2013代码模板设置

    模板设置是为了在“添加新项”时默认格式 1.打开文件:D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTempl ...

  6. Git 分支管理 多人协作 远程仓库 补充

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了, 并且,远程仓库的默认名称是origin. 如果是本地仓库关联远程仓库 --- 要查看远程库的信息,用 ...

  7. SpringMVC中的常用注解

    RequestParam 作用: 用于  将请求参数区数据  映射到  功能处理方法的参数上. 属性: value  请求参数中的名称 required   请求参数中是否必须提供此参数. 默认值: ...

  8. SAS批量导出sas7bdata至excel

    /*创建输出excel的宏*/ %macro export(inlib,intbl,outpath,outfile); proc export data=&inlib..&intbl ...

  9. 求10000以内n的阶乘(openjudge 2923)

    求10000以内n的阶乘 总时间限制:  5000ms 内存限制:  655360kB 描述 求10000以内n的阶乘. 输入 只有一行输入,整数n(0<=n<=10000). 输出 一行 ...

  10. 第六章 “我要点爆”微信小程序云开发实例之爆文详情页制作

    爆文详情页制作 从首页中数据列表打开相应详情页面的方法: 给数据列表中每个数据项加一个点击事件,同时将当前数据项的id暂时记录在本地,然后跳转到详情页面detail goopen: function ...