UVA-11214 Guarding the Chessboard (迭代加深搜索)
题目大意:在一个国际象棋盘上放置皇后,使得目标全部被占领,求最少的皇后个数。
题目分析:迭代加深搜索,否则超时。
小技巧:用vis[0][r]、vis[1][c]、vis[2][r+c]、vis[c-r+N]分别标志(r,c)位置相对应的行、列、主、副对角线有没有被占领(详见《入门经典(第2版)》P193),其中N表示任意一个比行数和列数都大(大于等于)的数。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; char p[13][13];
int vis[4][30],n,m,ans; bool dfs(int cur,int maxd)
{
if(cur==maxd){
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(p[i][j]=='X'&&!vis[0][i]&&!vis[1][j]&&!vis[2][i+j]&&!vis[3][j-i+11])
return false;
return true;
}
for(int i=cur+1;i<=n;++i){
for(int j=1;j<=m;++j){
if(!vis[0][i]||!vis[1][j]||!vis[2][i+j]||!vis[3][j-i+11]){
int a=vis[0][i],b=vis[1][j],c=vis[2][i+j],d=vis[3][j-i+11];
vis[0][i]=vis[1][j]=vis[2][i+j]=vis[3][j-i+11]=1;
if(dfs(cur+1,maxd))
return true;
vis[0][i]=a,vis[1][j]=b,vis[2][i+j]=c,vis[3][j-i+11]=d;
}
}
}
return false;
}
int main()
{
int cas=0;
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
for(int i=1;i<=n;++i)
scanf("%s",p[i]+1);
int ans;
for(ans=1;;++ans){
memset(vis,0,sizeof(vis));
if(dfs(0,ans))
break;
}
printf("Case %d: %d\n",++cas,ans);
}
return 0;
}
UVA-11214 Guarding the Chessboard (迭代加深搜索)的更多相关文章
- UVA - 11214 Guarding the Chessboard(迭代加深搜索)
题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...
- UVA - 11214 Guarding the Chessboard(守卫棋盘)(迭代加深搜索)
题意:输入一个n*m棋盘(n,m<10),某些格子有标记.用最少的皇后守卫(即占据或者攻击)所有带标记的格子. 分析:因为不知道放几个皇后可以守卫所有带标记的格子,即回溯法求解时解答树的深度没有 ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
- UVA 1343 - The Rotation Game-[IDA*迭代加深搜索]
解题思路: 这是紫书上的一道题,一开始笔者按照书上的思路采用状态空间搜索,想了很多办法优化可是仍然超时,时间消耗大的原因是主要是: 1)状态转移代价很大,一次需要向八个方向寻找: 2)哈希表更新频繁: ...
- UVA 11212 Editing a Book [迭代加深搜索IDA*]
11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange the ...
- UVA 11214 Guarding the Chessboard 守卫棋盘(迭代加深+剪枝)
暴力,和八皇后很像,用表示i+j和i-j标记主对角线,但是还是要加一些的剪枝的. 1.最裸的暴搜 6.420s,差点超时 2.之前位置放过的就没必要在放了,每次从上一次放的位置开始放 0.400s # ...
- UVA - 1374 Power Calculus (dfs迭代加深搜索)
题目: 输入正整数n(1≤n≤1000),问最少需要几次乘除法可以从x得到xn ?在计算过程中x的指数应当总是正整数. 思路: dfs枚举次数深搜 注意: 1.指数如果小于0,就退出当前的搜索 2.n ...
- UVA 11214 Guarding the Chessboard
题意: 皇后防御的范围是他所在横.竖.对角线,地图上的#为可以放旗子的地方.问最少放几个皇后能防守所有#. 分析: vis数组开4维,对应行.列.主对角线.副对角线 代码: #include < ...
- UVA - 11214 Guarding the Chessboard (可重复覆盖,DLX+IDA*)
题目链接 正解是IDA*+四个方向判重,但由于是个裸的可重复覆盖问题,可以用DLX水过~ 每个格子与放上皇后能干掉的标记连边,跑可重复覆盖DLX.注意要用IDA*来优化,否则会超时. #include ...
随机推荐
- 容易遗忘的JS知识点整理
1.hasOwnProperty相关 为了判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自 Object.prototype 的 hasOwnProperty方法.hasOwnP ...
- scrapy运行方式
1,在cmd 命令行下执行 scrapy crawl demo (爬虫主逻辑的 name= 'demo '的名字) 2, 也可以在spider目录下添加一个py文件,加入以下代码 from scra ...
- [c/c++]指针(2)
首先呢,讲讲数组 数组就是一连串的地址对不对?所以它们的地址是紧挨着的 1 | 2 | 3 | 4 | 2 | 0 1 2 3 4 那我们把一个数组的首地址赋给一个指针变量 ] = {, , , , ...
- CSS3 常用选择器
p:last-of-type{background-color: red;} 选择p中最后一项 p:nth-of-type(2n){background-color: red;} 隔行变色里面也可以填 ...
- 用python + hadoop streaming 编写分布式程序(三) -- 自定义功能
又是期末又是实训TA的事耽搁了好久……先把写好的放上博客吧 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍 ...
- org.apache.shiro.session.InvalidSessionException: java.lang.IllegalStateException: getAttribute: Session already invalidated] with root cause
1.遇到以下异常,找了好长时间,终于解决,报的异常如下: 七月 07, 2017 3:02:16 下午 org.apache.catalina.core.StandardWrapperValve in ...
- Java之Elasticsearch 增删改查
<!--ELK --> <dependency> <groupId>org.elasticsearch.client</groupId> <art ...
- 【Coursera】Third Week(2)
拾遗 Steve Jobs与World Wide Web 如果你有仔细观察Robert Cailliau的视频的话,你会发现他工作所用的电脑为NeXT电脑. Jobs 也对web 产生了一定的影响,众 ...
- FAILED Selenium2Library
FAILED Selenium2Library Importing test library 'Selenium2Library' failed: ImportError: cannot import ...
- MVC ---- 如何扩展方法
先定义一个扩展类: public static class StringExtend { //扩展一个string的方法 public static bool IsNullOrEmpty(this s ...