题意:输入一个 n×mn\times mn×m 棋盘,某些格子有标记。用最少的皇后守卫(即占据或者攻击)所有带标记的格子。

分析:因为不知道放几个皇后可以守卫所有带标记的格子,即回溯法求解时解答树的深度没有明显的上限,所以使用迭代加深搜索。

将棋盘的每个格子标记为 0∼n×m−10\sim n\times m-10∼n×m−1,依次枚举守卫的皇后个数,枚举当前守卫的皇后个数下所有的放置情况,看是否能全部守卫。(枚举方式:iii 枚举 1∼n1\sim n1∼n,jjj 枚举 i+1∼ni+1\sim ni+1∼n)

AC code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1005;
string s[maxn];
int vis[maxn][maxn];
int v[maxn][maxn];
int t;
int n,m;
bool check(){
for(int i=0;i<n;i++){//判断所有被标记的正方形是否被保护
for(int j=0;j<m;j++){
if(v[i][j]&&!vis[0][i]&&!vis[1][j]&&!vis[2][j+i]&&!vis[3][j-i+n])
return 0;
}
}
return 1;
}
bool dfs(int cur,int pos,int tot){
if(cur==tot){//放置tot个皇后是否可全保护
if(check()){
cout<<"Case "<<t<<": "<<tot<<endl;
return 1;
}
return 0;
}
for(int i=pos;i<=n*m;i++){//所有点被标记成0~n*m-1
int x=i/m;//当前位置的横坐标
int y=i%m;
int tmp1=vis[0][x];
int tmp2=vis[1][y];
int tmp3=vis[2][x+y];
int tmp4=vis[3][y-x+n];
vis[0][x]=vis[1][y]=vis[2][x+y]=vis[3][y-x+n]=1;
if(dfs(cur+1,i+1,tot)){
return 1;//此处优化,i+1下次枚举是当前位置再加1,避免情况重复
}
vis[0][x]=tmp1;
vis[1][y]=tmp2;
vis[2][x+y]=tmp3;
vis[3][y-x+n]=tmp4;
}
return 0;//枚举当前所有情况不满足
}
signed main(){
while(cin>>n){
if(n==0){
break;
}
t++;
cin>>m;
memset(v,0,sizeof(v));
for(int i=0;i<n;i++){
cin>>s[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='X'){
v[i][j]=1;
}
}
}
for(int i=0;;i++){
memset(vis,0,sizeof(vis));
if(dfs(0,0,i)){
break;
}
}
}
return 0;
}

题解:UVA11214 守卫键盘 Guarding the Chessboard的更多相关文章

  1. 【习题 7-10 Uva11214】Guarding the Chessboard

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 可以想见最后深度不会很深吧.. 然后皇后之间互相攻击到是允许的.. 就这样 [代码] /* 1.Shoud it u ...

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

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

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

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

  4. UVA 11214 Guarding the Chessboard 守卫棋盘(迭代加深+剪枝)

    暴力,和八皇后很像,用表示i+j和i-j标记主对角线,但是还是要加一些的剪枝的. 1.最裸的暴搜 6.420s,差点超时 2.之前位置放过的就没必要在放了,每次从上一次放的位置开始放 0.400s # ...

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

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

  6. UVA 11214 Guarding the Chessboard

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

  7. Guarding the Chessboard(UVa 11214)

    本题题意: 输入一个n*m的棋盘,某些格子有标记,用最少的皇后占据或者攻击所以带标记的格子.皇后的攻击范围为同行同列和同对角线. 可以使用IDA*算法,即从样例可以发现只需要最多5个棋子就可以对棋盘上 ...

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

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

  9. Solution: 题解 CF1196E Connected Component on a Chessboard

    感觉这题还可以 因为总空间比输入数量 不知高到哪里去了 ,所以完全不需要考虑放不下的问题 从贪心的角度考虑,如果要使相差数量巨大的\(b\)和\(w\)能够成功放下来,应该使这些方块尽量分散(似乎有点 ...

  10. 【题解】宫廷守卫 [P1263]

    [题解]宫廷守卫 [P1263] 传送门:宫廷守卫 \([P1263]\) [题目描述] 给出一个 \(n*m\) 的方格图,分别用整数 \(0,1,2\) 表示空地.陷阱.墙,空地上可以放置守卫,如 ...

随机推荐

  1. 注册全局组件(H5) 任意页面使用

    在view下创建components文件夹. 在components下创建文件夹base. base文件夹是用来存放 基础组件的. 比如说页面中很多处都在使用的公共组件 如你需要自定义的按钮 在com ...

  2. 彰显科技硬实力!天翼云论文在国际顶刊JoCCASA发表!

    近日,由天翼云科技有限公司云网产品事业部混合云团队完成的论文<Multivariate Time Series Collaborative Compression for Monitoring ...

  3. Ubuntu开启root账户步骤

    在VMware中新建一个Ubuntu,经常使用sudo 太麻烦,还是开启root账户吧. 1.打开 终端: 输入下列命令sudo gedit /usr/share/lightdm/lightdm.co ...

  4. 并发编程 - 线程同步(五)之原子操作Interlocked详解二

    上一章我们学习了原子操作Interlocked类的几个常用方法,今天我们将继续学习该类的其他方法. 01.Exchange方法 该方法用于原子的将变量的值设置为新值,并返回变量的原始值.该方法共有14 ...

  5. Flink同步kafka到iceberg(cos存储)

    一.flink到logger 1.source create table source_table ( id bigint comment '唯一编号' ,order_number bigint co ...

  6. Trae初体验

    前情 自从AI IDE面世以来,网络上到处流传程序员要失业了,小白也能轻松完成程序开发了,某某0基础靠AI上架了苹果应用,平时工作也有偶尔用用AI工具的我,都觉得这些都是标题党文章不予理会的,直到看到 ...

  7. KaFka 安装与基本使用

    学了有一段时间的大数据了,学习新的组件,大部分安装可以分为三步:上传解压,配置文件,启动. 分享一下我的kafka安装包: 链接:https://pan.baidu.com/s/1fbydwZwcYy ...

  8. P4118 [Ynoi2018] 末日时在做什么?有没有空?可以来拯救吗?

    YNOI 智慧题 EasyVer1 [Ynoi Easy Round 2015] 世上最幸福的女孩 EasyVer2 小白逛公园 先看 EasyVer2 单点修改 区间查询最大子段和 考虑在线段树维护 ...

  9. vue-element-admin安装趟坑

    1.下载源码 2.执行 npm install --registry=https://registry.npm.taobao.org 如果遇到"git ls-remote -h -t&quo ...

  10. 基于OpenSSL的密码管理系统-应用密码学课程报告

    第1章 概要设计 1.1 设计目的 本研究旨在设计并实现一个基于OpenSSL的密码管理系统,该系统具备密钥对的生成.密钥上传.密钥的核对.身份认证.文件与邮件的加密和解密.数字签名及数字证书管理等常 ...