题意:破解字迷之后,你得知Kid将会在展览开始后T分钟内盗取至少一颗宝石,并离开展馆。整个展馆呈矩形分布,划分为N*M个区域,有唯一的入口和出口(不能从出口进入,同样不能从入口出去)。由某个区域可直接移动至相邻四个区域中的一个,且最快需要一分钟。假设Kid进入放有宝石的区域即可盗取宝石,无需耗时。问至少要封锁几个区域(可以封锁放有宝石的区域,但不能封锁入口和出口)才能保证Kid无法完成任务
题解:
封锁出口或者入口周围的格子. 
最多需要4个封锁点. 
所以我们可以采取这样的策略: 
1.寻找一条盗贼的可行路线,如果没有,返回0. 
2.计算封锁出口和入口四周需要的封锁点数量,取小的一个,假设是k,k <=4 
3.从少到多,遍历所有封锁点个数小于k的方案,验证是否是一条有效的覆盖方案
(可以通过是否阻止了1中的盗贼线路进行快速验证). 
如果有有效覆盖方案,返回这个方案的覆盖点值,否则继续. 
4.如果没有比k小的覆盖方案,返回k. 
时间复杂度: 
最多(M*N)^3次有效覆盖验证.即(8*8)^3=256k次.其中有很大一部分可以通过快速验证排除(取决于1的路径长短,所以一般1应该求出最短路径的可行路线)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <queue>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define maxn 1<<16
#define mem(a) memset(a,0,sizeof(a))
const double eps = 1e-10;
int n,m,t,ans;
char map[10][10];
int vis[2][10][10];
int mx[4] = {0,0,1,-1};
int my[4] = {1,-1,0,0};
struct node
{int x,y,t,k;int rox[64],roy[64];
}start,end,temp,in;
void dfs(int deep)
{if(deep > ans)return;int minstep = -1;node q;queue <node> Q;Q.push(start);mem(vis);vis[0][start.x][start.y] = 1;while(!Q.empty()){q = Q.front();Q.pop();if(q.t > t)continue;if(q.k && map[q.x][q.y] == 'E'){minstep = q.t;break;}for(int i = 0; i < 4; i++){int dx = q.x + mx[i];int dy = q.y + my[i];if(dx < 0 || dx >= n || dy < 0 || dy >= m)continue;if(map[dx][dy] == '#')continue;if(map[dx][dy] == 'J')in.k = 1;elsein.k = q.k;if(vis[in.k][dx][dy])continue;vis[in.k][dx][dy] = 1;in.x = dx;in.y = dy;in.t = q.t + 1;for(int j = 1; j <= q.t; j++){in.rox[j] = q.rox[j];in.roy[j] = q.roy[j];}in.rox[in.t] = dx;in.roy[in.t] = dy;Q.push(in);}}if(minstep == -1){if(deep < ans)ans = deep;return;}for(int i = 1; i < q.t; i++){char c = map[q.rox[i]][q.roy[i]];if(c == 'S' || c == 'E')continue;map[q.rox[i]][q.roy[i]] = '#';dfs(deep+1);map[q.rox[i]][q.roy[i]] = c;}
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&t);for(int i = 0; i < n; i++)scanf("%s",map[i]);int i,j;memset(vis,false,sizeof(vis));for(i = 0; i < n; i++)for(j = 0; j < m; j++){if(map[i][j] == 'S'){start.x = i;start.y = j;start.t = 0;start.k = 0;break;}}ans = 4;dfs(0);printf("%d\n",ans);}return 0;
}

hdu 1983 Kaitou Kid - The Phantom Thief (2)相关推荐

  1. hdu 1983 Kaitou Kid - The Phantom Thief (2)【Bfs+暴力枚举】

    Kaitou Kid - The Phantom Thief (2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32 ...

  2. HDU - 1982 Kaitou Kid - The Phantom Thief

    HDU - 1982 Kaitou Kid - The Phantom Thief 传送门 问题描述: Do you know Kaitou Kid? In the legend, Kaitou Ki ...

  3. HDU 1983:Kaitou Kid - The Phantom Thief (2)

    Kaitou Kid - The Phantom Thief (2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32 ...

  4. 『杭电1982』Kaitou Kid - The Phantom Thief (1)

    #include <bits/stdc++.h> using namespace std; string str[10010]; string str1[10010]; int main ...

  5. AtCoder AGC031E Snuke the Phantom Thief (费用流)

    题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_e 题解 做法一(我的做法) 这是我yy出来的一个上下界费用流做法,自己没找到什么反例,能过. ...

  6. [AGC031E] Snuke the Phantom Thief(网络流)

    考虑枚举偷的珠宝的个数k,且假设它们按照坐标大小排好了序(x坐标排一次,y坐标排一次). 那么可以将条件转化一下, 在珠宝按x坐标排好序时, x坐标大于等于aia_iai​的最多取bib_ibi​个可 ...

  7. HDU-基础搜索总结

    Dfs: 1241 Oil Deposits 题解:https://blog.csdn.net/HeZhiYing_/article/details/81053035 1016 Prime Ring ...

  8. ACM集训STL(1)学习杂记(二)——E题~H题

    STL(1) (E)Online Judge 很简单的一道题,再看自己的代码会发现一些没必要的地方. Online Judge Ignatius is building an Online Judge ...

  9. HDOJ搜索题辑录I(总计100题)

    DFS(Depth First Search ) 一般是不用hash的,所以很多时候称之为"暴力",也就是穷举所有情况,一般看几个我们OJ的dfs的版本的题目就可以模仿着做了,因为 ...

最新文章

  1. C++对象模型详解(上)
  2. 4、Power Map—实例:演示报告封面
  3. Tomcat之Windows下安装
  4. 机器学习之 weka学习(六)最大内存
  5. 数据仓库入门(实验10)在Excel中查询层次结构
  6. docker私有仓库Harbor 使用文档
  7. Reveal v4(8796) 使用
  8. jQuery的ajax提交表单
  9. 微课|《Python编程基础与案例集锦(中学版)》第3章例题讲解(2)
  10. 为什么我们做不到【员工篇】作者:金刚波
  11. 显卡驱动设备状态代码31
  12. linux 网站图片无法加载失败怎么办,网页无法加载图片怎么办?解决网页图片无法显示的方法...
  13. 一年的网络学习经历小结
  14. 数据挖掘与机器学习——数据挖掘概述
  15. 【项目分享】基于AB32和RT-Thread的墨水屏智能日历
  16. “d3dx9.h”: No such file or directory 解决办法
  17. 【SRE笔记 2022.9.21 网络及TCP握手】
  18. 汉诺塔(C语言实现)
  19. 第七届 Sky Hackathon 笔记集合贴
  20. “postcss-px-to-viewport”——移动端前端适配的又一种方案

热门文章

  1. Debian11系统安装
  2. 社会管理网格化 源码_威县方家营镇创新“网格化”管理模式,助推乡村社会治理能力提升...
  3. Task5样式色彩秀芳华
  4. 密码学归约证明——选择明文攻击下的不可区分性
  5. mybatis的错误:Failed to load ApplicationContext
  6. rpmbuild SPEC文件的语法
  7. Redis 互联网开发必看
  8. 量子计算第一股IonQ:“小众”离子阱如何弯道超车
  9. windows 7正版才是王道
  10. C#流程控制————分支结构