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*) 迭代加深搜索
迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...
随机推荐
- C#API接口调试工具
自从去年软件界网站开发推崇前后端分离,我们公司也在进行转行行,从原先的前端架构,后端架构,数据库搭建一肩挑的模式也逐渐转型为前后端分离,大量招收前端开发人员,原来的人员也转型为专职的后端开发,这样的变 ...
- CSS 定位 (Positioning)概述
div.h1 或 p 元素常常被称为块级元素. 这意味着这些元素显示为一块内容,即“块框”. 与之相反,span 和 strong 等元素称为“行内元素”,这是因为它们的内容显示在行中,即“行内框”. ...
- 实现简易版shell
操作系统小组作业,实现一个简易shell,shell实现了下列命令 exit------退出终端命令 clr-------清屏命令 time-----时间命令 myshell----欢迎命令 quit ...
- django更换数据库时提示"django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE7\\x94\\xA8\\xE6\\x88\\xB7' for column 'name' at row 1")"
问题提出 昨天在运行django时,初始化使用的是自带的数据库,后来更换mysql数据库,数据库同步之后,打开mysql无法添加数据,插入数据时,提示django.db.utils.InternalE ...
- nginx反向代理解决跨域问题,使本地调试更方便
我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...
- CC34:判断直线相交
题目 解法 水题,判断斜率.判断截距,ok..... class CrossLine { public: bool checkCrossLine(double s1, double s2, doubl ...
- 【SPOJ】Substrings
出现次数很好处理,就是 \(right/endpos\) 集合的大小 那么,直接构建 \(SAM\) 求出每个位置的\(right\)集合大小 直接更新每个节点的\(longest\)就行了 最后短的 ...
- Linux —— ps命令
Ps命令 作用 显示瞬间进程的状态,并不动态连续: 如果想对进程进行实时监控应该用top命令: 对进程的管理,可以使用kill命令发送信号 Ps PID : 运行着的命令的进程编号 TTY : 命令所 ...
- 告别JQuery(一)
背景 很多很多传统的Web开发者还在用着传统的jquery和ES5,大家都知道现在的前端如火如荼,但是眼花缭乱的框架和层出不穷的新概念,让很多人无从下手,本文从0开始,带你一步步由jquery操作DO ...
- 对于es线程池使用的思考
es有内置的线程池 在实际项目中,发现 使用client框架关闭连接太慢(其实是把连接归还到池子里),采用异步关闭. 随着连接的关闭,计算机内存在不断下降 ------------------- ...