UVA - 11214 Guarding the Chessboard(迭代加深搜索)
题目:
输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子。输出皇后的个数。
思路:
一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发现这样要枚举的量太大了……于是换用迭代加深搜索。对于每个格子有四个方向可以用i,j,i+j,i+j+maxn(下标要是正的)表示,当cur等于枚举的答案maxd就判断是不是所有的标记都被攻击了。
另外如果这个格子放上了皇后,那该皇后所在行的后边的格子就没必要枚举了,直接跳到下一行的开头就可以了。
将二维数组线性表示的代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
char mp[maxn][maxn];
int vis[][maxn*];
int n,m,maxd; bool isok(){//判断所有的标记是不是都已经被攻击
for(int i=; i<n; i++){
for(int j=; j<m; j++){
if(mp[i][j]=='X' && !vis[][i] && !vis[][j] && !vis[][i+j] && !vis[][i-j+maxn]){
return false;
}
}
}
return true;
} bool dfs(int now, int cur){
if(cur==maxd){
return isok() ? true : false;
} for(int k=now; k<n*m; k++){
int i = k/n,j = k%m;
vis[][i]++; vis[][j]++; vis[][i+j]++; vis[][i-j+maxn]++;//对四个方向进行标记
if(dfs((i+)*m,cur+)){
return true;
}
vis[][i]--;vis[][j]--;vis[][i+j]--;vis[][i-j+maxn]--;//恢复四个方向dfs之前的状态
}
return false;
} int main(){
//FRE();
int kase = ;
while(scanf("%d",&n) && n){
scanf("%d",&m);
getchar();
for(int i=; i<n; i++){
gets(mp[i]);
}
memset(vis,,sizeof(vis));
for(maxd = ;; maxd++){
if(dfs(,)){
break;
}
}
printf("Case %d: %d\n",++kase,maxd);
}
return ;
}
正常二维数组表示代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
char mp[maxn][maxn];
int vis[][maxn*];
int n,m,maxd; bool isok(){//判断所有的标记是不是都已经被攻击
for(int i=; i<n; i++){
for(int j=; j<m; j++){
if(mp[i][j]=='X' && !vis[][i] && !vis[][j] && !vis[][i+j] && !vis[][i-j+maxn]){
return false;
}
}
}
return true;
} bool dfs(int x,int y, int cur){
if(cur==maxd){
return isok() ? true : false;
} for(int i=x; i<n; i++){
for(int j=y; j<m; j++){
vis[][i]++; vis[][j]++; vis[][i+j]++; vis[][i-j+maxn]++;//对四个方向进行标记
if(dfs(i+,,cur+)){//这一行后边的都不用遍历了,直接跳到下一行的开头就可以了
return true;
}
vis[][i]--;vis[][j]--;vis[][i+j]--;vis[][i-j+maxn]--;//恢复四个方向dfs之前的状态
}
}
return false;
} int main(){
//FRE();
int kase = ;
while(scanf("%d",&n) && n){
scanf("%d",&m);
getchar();
for(int i=; i<n; i++){
gets(mp[i]);
} for(maxd = ;; maxd++){
memset(vis,,sizeof(vis));
if(dfs(,,)){
break;
}
}
printf("Case %d: %d\n",++kase,maxd);
}
return ;
}
UVA - 11214 Guarding the Chessboard(迭代加深搜索)的更多相关文章
- 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 ...
随机推荐
- (转)C3P0配置
C3P0是一个开源的JDBC 连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. sourceforge 下载: ...
- [整理]EABI和OABI【转】
本文转载自:https://www.crifan.com/order_eabi_and_oabi/ 1.什么是ABIABI,application binary interface (ABI),应用程 ...
- 第八周 Leetcode 44. Wildcard Matching 水题 (HARD)
Leetcode 44 实现一种类似正则表达式的字符串匹配功能. 复杂度要求不高, 调代码稍微费点劲.. 好像跟贪心也不太沾边, 总之 *把待匹配串分成若干个子串, 每一个子串尽量在模式串中靠前的部分 ...
- SVN 打补丁 Apply Patch ***
SVN补丁的方式,在不能连接服务器或者没有修改的权限,但是迫于形势,你又必须对这个文件进行修改,这时你就可以用Create patch创建补丁,然后把你创建的补丁发给项目人,或对此目录有写权限的工作人 ...
- 计算属性 computed
计算属性 computed 计算缓存 vs Methods <div id="example"> <p>Original message: "{{ ...
- Spark 二项逻辑回归__二分类
package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{B ...
- 云服务器装teamviewer
[int32] EulaAccepted = 1 [int32] EulaAcceptedRevision = 6
- hexo简易脚本
!/bin/bash 检查是否为master分支.目录是否正确 function git-branch-name { git symbolic-ref --short -q HEAD } functi ...
- http升级https(转)
让你的网站免费支持 HTTPS 及 Nginx 平滑升级 为什么要使用 HTTPS ? 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上 ...
- Androidstudio的安装与使用调试
1安装与基本使用 1.1androidstudio的安装 1.到android-studio\bin文件夹里面,根据自己的电脑配置,打开studio.exe或者studio64.exe 2.按照向导默 ...