HDU 1983 Kaitou Kid - The Phantom Thief (2)
神题,搜索太差,来自网络的题解与程序
思路:
封锁出口或者入口周围的格子.
最多需要4个封锁点.
所以我们可以采取这样的策略:
1.寻找一条盗贼的可行路线,如果没有,返回0.
2.计算封锁出口和入口四周需要的封锁点数量,取小的一个,假设是k,k <=4
3.从少到多,遍历所有封锁点个数小于k的方案,验证是否是一条有效的覆盖方案
(可以通过是否阻止了1中的盗贼线路进行快速验证).
如果有有效覆盖方案,返回这个方案的覆盖点值,否则继续.
4.如果没有比k小的覆盖方案,返回k.
时间复杂度:
最多(M*N)^3次有效覆盖验证.即(8*8)^3=256k次.其中有很大一部分可以通过快速验证排除(取决于1的路径长短,所以一般1应该求出最短路径的可行路线)
#include<queue>
#include<iostream>
#include<algorithm>
#define FOR(i,n) for(i=0;i<n;i++) using namespace std; char Map[][][];//地图
char vis[][][];//访问记录
int sx,sy,n,m,t;
int dir[][]={{,},{-,},{,},{,-}};//下,上,右,左 struct Node{
int x,y,f;//坐标,楼层
}; bool bfs(){//标准的BFS
queue<Node>que;
Node no,ne;
int i;
memset(vis,-,sizeof(vis));
no.x=sx,no.y=sy,no.f=;
que.push(no);
vis[][sx][sy]=;
while(!que.empty()){
no=que.front(),que.pop();
if(vis[no.f][no.x][no.y]>=t) continue;//算是剪枝吧
FOR(i,){
ne.x=no.x+dir[i][],ne.y=no.y+dir[i][],ne.f=no.f;
if(ne.x<||ne.y<||ne.x>=n||ne.y>=m) continue;
if(Map[ne.f][ne.x][ne.y]=='#') continue;
if(Map[ne.f][ne.x][ne.y]=='J') ne.f=;
if(Map[ne.f][ne.x][ne.y]=='E'&&ne.f) return false;//ne.f=1表示已经拿到J
if(vis[ne.f][ne.x][ne.y]!=-) continue;
vis[ne.f][ne.x][ne.y]=vis[no.f][no.x][no.y]+;
que.push(ne);
}
}
return true;
} bool DFS(int tot){//标准DFS ,tot表示要堵的点的个数
int i,j;
if(!tot) return bfs();
FOR(i,n)
FOR(j,m){
if(Map[][i][j]=='.'||Map[][i][j]=='J'){
char emp=Map[][i][j];
Map[][i][j]='#';
if(DFS(tot-)) return true;
Map[][i][j]=emp;
}
}
return false;
} int main(){
int k,i,j,a,b;
scanf("%d",&k);
while(k--){
scanf("%d%d%d",&n,&m,&t);
FOR(i,n){
scanf("%s",Map[][i]);
FOR(j,m) if(Map[][i][j]=='S') sx=i,sy=j;
strcpy(Map[][i],Map[][i]);//复制第二层楼
}
FOR(i,) if(DFS(i)){//把0~3个的点搜索一遍
printf("%d\n",i);
break;
}
i==?puts(""):;//如果前三点都没有成立的,最多四个,所以输出四
}
return ;
}
HDU 1983 Kaitou Kid - The Phantom Thief (2)的更多相关文章
- HDOJ/HDU 1982 Kaitou Kid - The Phantom Thief (1)(字符串处理)
Problem Description Do you know Kaitou Kid? In the legend, Kaitou Kid is a master of disguise, and c ...
- 【HDOJ】1983 Kaitou Kid - The Phantom Thief (2)
不仅仅是DFS,还需要考虑可以走到终点.同时,需要进行预处理.至多封闭点数为起点和终点的非墙壁点的最小值. #include <iostream> #include <cstdio& ...
- HDU——1982Kaitou Kid - The Phantom Thief (1)(坑爹string题)
Kaitou Kid - The Phantom Thief (1) Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/327 ...
- hdu 1983(BFS+DFS) 怪盗Kid
http://acm.hdu.edu.cn/showproblem.php?pid=1983 首先,题目要求出口和入口不能封闭,那么,只要把出口或入口的周围全给封闭了那盗贼肯定无法成功偷盗,出口或入口 ...
- HDU 1983 BFS&&DFS
大多数刚需封锁4区域可以,DFS地区封锁.BFS无论是通过 #include "stdio.h" #include "string.h" #include &q ...
- 「题解」agc031_e Snuke the Phantom Thief
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 AT4695.AtCoder agc031_e. 题意简述 在二维平面上,有 \(n\) 颗珠宝,第 \(i\) 颗 ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
- hdu 3926 Hand in Hand 同构图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 In order to get rid of Conan, Kaitou KID disguis ...
- 【AtCoder】AGC031
A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include <bits/stdc++.h> # ...
随机推荐
- CRM需要注意的一些事,修改字段类型
crm字段类型如果变了,比如文本类型变为查找类型,要新建命名跟原来不一样,千万不能删除以前的字段再建原来的一样的,那样如果导到正式系统会造成无法导入,执行sql失败, 切记切记.可以字段名后加2,或者 ...
- sql中复合组建解析
每个表只能有一个主键 唯一键/约束可以多个 复合主键是指复合唯一,比如: 1 1 1 2 2 1 2 2 单看任何一列都不是唯一,但组合起来就是唯一的. Create Table 表名 (字段名1 I ...
- 关于Oracle将小于1的数字to_char后丢掉0的解决办法
SQL代码如下: select rtrim(to_char(0.11, 'fm9990.99'), '.') from dual;其中0.11为需要to_char的数字fm去掉字符串前面的空格9990 ...
- Filemanager 的使用
filemanager的使用包括: 1.创建文件夹 2.删除文件夹 3.写入文件 4.复制文件 5.移动文件 6.删除文件 一.创建文件夹 首先宏的定义一个字符串作为地址的来获取当前的docum ...
- linq中的cast<T>()及OfType<T>()
DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.R ...
- spring mvc 的基本注解
刚开始学习spring mvc 有很多东西不是很了解 spring mvc 四个基本注解 annotation(控制层,业务层,持久层) -- @Component.@Repository @Se ...
- Hibernate总结(二)---hibernate中的各种映射
知识的准备: (参考:汤阳光Hibernate3.6(基础)) 一.浅谈javaBean之间的关系 存在的关系: 1.关联(一对一.一对多.多对一.多对多) 2.聚合/组合(最后考虑) 3.继承 所以 ...
- CSS background-repeat 属性
###起因 >今天遇到一个问题,就是在给一个元素设置width 属性为100% 之后, 鼠标放上去之后,仍然只有部分是阴影状态,如下图所示: --- 经过一番思索,这TM 不就是,hover 上 ...
- NAND FLASH ECC校验原理与实现
ECC简介 由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块.为了检测数据的可靠性,在应用NAND ...
- 操作native window的QxtWindowSystem (好像是一个IM的一部分)
http://libqxt.bitbucket.org/doc/0.6/qxtwindowsystem.html https://github.com/psi-plus/plugins/blob/ma ...