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> # ...
随机推荐
- C# Attribute(特性)之---数据契约 [DataContract]
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...
- Codility 1: equilibrium
提交了格灵深瞳的简历后,收到需要先进行一个简单的技术测试的通知,临时抱佛脚,先刷刷上面几道题: 题目要求 A zero-indexed array A consisting of N integers ...
- Labview学习之波形图表的历史数据
Labview学习之波形图表的历史数据 默认的情况下,波形图表显示100个点, 因为波形图表默认的缓冲区大小为1024,在默认的情况下如果修改图形图标属性中的标尺项,选中自动调整标尺,如图:2011- ...
- HDU4323-Magic Number(levenshtein distance-编辑距离)
描述: There are many magic numbers whose lengths are less than 10. Given some queries, each contains a ...
- R与数据分析旧笔记(三)不知道取什么题目
连线图 > a=c(2,3,4,5,6) > b=c(4,7,8,9,12) > plot(a,b,type="l") 多条曲线效果 plot(rain$Toky ...
- Protel99se教程一:建立一个数据库文件
学习Protel99 SE的第一步,是建立一个DDB文件,也就是说,使用protel99se进行电路图和PCB设计,以及其它的数据,都存放在一个统一的DDB数据库中的 一.打开protel 99se后 ...
- 使用Fiddler解析WCF RIA Service传输的数据
原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html 使用Fiddler 2 解析WCF RIA Service传输的 ...
- Hash 表详解(哈希表)
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...
- Highlighting an element as it is hovered over (like inspect element in FireBug) - jQuery Forum
Highlighting an element as it is hovered over (like inspect element in FireBug) - jQuery Forum Highl ...
- cocos2d-x 多点触控实现缩放及相关问题的解决方法
首先,来看下代码: 声明文件: #ifndef __loading__MoreTouches__ #define __loading__MoreTouches__ #include <iostr ...