Kaitou Kid - The Phantom Thief (2)

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1268    Accepted Submission(s): 454

Problem Description

破解字迷之后,你得知Kid将会在展览开始后T分钟内盗取至少一颗宝石,并离开展馆。整个展馆呈矩形分布,划分为N*M个区域,有唯一的入口和出口(不能从出口进入,同样不能从入口出去)。由某个区域可直接移动至相邻四个区域中的一个,且最快需要一分钟。假设Kid进入放有宝石的区域即可盗取宝石,无需耗时。问至少要封锁几个区域(可以封锁放有宝石的区域,但不能封锁入口和出口)才能保证Kid无法完成任务。

Input

输入的第一行有一个整数C,代表有C组测试数据。每组测试数据的第一行有三个整数N,M,T(2<=N,M<=8,T>0)。接下来N行M列为展馆布置图,其中包括:

'S':入口
'E':出口
'J':放有宝石的区域,至少出现一次
'.':空白区域
'#':墙

Output

对每组测试数据,输出至少要封锁的区域数。

Sample Input

2

5 5 5

SJJJJ

..##J

.JJJJ

.J...

EJ...

5 5 6

SJJJJ

..##J

.JJJJ

.J...

EJ...

Sample Output

0

2

Author

LL

Source

2008杭电集训队选拔赛

其实这个题应该是保证了没有SE紧挨的情况。一会对应我的思路大家就能知道为什么。

对于这个题后台数据的异议,这种样例应该输出3呢,还是6呢。。。。不过没有卵子关系,这个题的后台数据应该保证了没有SE紧挨的情况,应该也没有必须先走到终点再到后边拿J再回来的情况。

1
4 3 100
JJJ
JSJ
JEJ
JJJ

我的思路构建一开始对于所有要考虑到的情况来讲,应该是有问题的,但是交了一发AC了,看来我的思路和出题人的想考察的点应该是对上了,虽然出题人对于这个题的数据也可以说是有纰漏了,不过既然我对上了出题人的出题角度了,咱AC了,也拿出来给大家说说0.0

既然这个题后台数据和题干有些纰漏,不过不要太纠结细节,AC了就好。

我的思路是这样滴:

无非数据结果的范围也就是0----4,要么不需要封锁,要么封锁几个关键点,要么最多封锁四个点,也就是出口或者是入口周围的四个点,直接封锁了这几个点就一定不可能使得小偷完成任务了,所以我们直接BFS+枚举情况

1、封锁一个点,

2、封锁两个点,

3、封锁三个点,如果封锁三个点也不行,那么直接输出4.

时间复杂度:最大:8*8*8*8*8*8(枚举三个点)*8*8(BFS);

既然这样的思路AC了,那么出题人的后台数据也就保证了没有SE紧挨的情况。

然后一点点枚举,细心一点即可。

AC代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct zuobiao
{int x,y,output,time;
}now,nex;
int n,m,t,ok,sx,sy;
char a[10][10];
int vis[10][10][100];
int fx[4]={0,0,1,-1};
int fy[4]={1,-1,0,0};
void Bfs(int x,int y)
{queue<zuobiao >s;memset(vis,0,sizeof(vis));now.x=x;now.y=y;now.output=0;now.time=0;vis[x][y][0]=1;s.push(now);while(!s.empty()){now=s.front();if(a[now.x][now.y]=='E'&&now.output>0){ok=1;return ;}s.pop();for(int i=0;i<4;i++){nex.x=now.x+fx[i];nex.y=now.y+fy[i];nex.time=now.time+1;if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&a[nex.x][nex.y]!='#'&&nex.time<=t){if(a[nex.x][nex.y]=='J'){nex.output=now.output+1;}else nex.output=now.output;if(vis[nex.x][nex.y][nex.output]==0){vis[nex.x][nex.y][nex.output]=1;s.push(nex);}}}}return ;
}
int solve()
{for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]=='#')continue;if(a[i][j]=='S')continue;if(a[i][j]=='E')continue;char tmp=a[i][j];a[i][j]='#';ok=0;Bfs(sx,sy);a[i][j]=tmp;if(ok==0)return 1;}}return 0;
}
int solve2()
{for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]=='#')continue;if(a[i][j]=='S')continue;if(a[i][j]=='E')continue;for(int k=0;k<n;k++){for(int l=0;l<m;l++){if(a[k][l]=='#')continue;if(a[k][l]=='S')continue;if(a[k][l]=='E')continue;char tmp1=a[i][j];char tmp2=a[k][l];a[i][j]='#';a[k][l]='#';ok=0;Bfs(sx,sy);a[i][j]=tmp1;a[k][l]=tmp2;if(ok==0)return 1;}}}}return 0;
}
int solve3()
{for(int x1=0;x1<n;x1++){for(int y1=0;y1<m;y1++){if(a[x1][y1]=='#')continue;if(a[x1][y1]=='S')continue;if(a[x1][y1]=='E')continue;for(int x2=0;x2<n;x2++){for(int y2=0;y2<m;y2++){if(a[x2][y2]=='#')continue;if(a[x2][y2]=='S')continue;if(a[x2][y2]=='E')continue;for(int x3=0;x3<n;x3++){for(int y3=0;y3<m;y3++){if(a[x3][y3]=='#')continue;if(a[x3][y3]=='S')continue;if(a[x3][y3]=='E')continue;char tmp1=a[x1][y1];char tmp2=a[x2][y2];char tmp3=a[x3][y3];a[x1][y1]='#';a[x2][y2]='#';a[x3][y3]='#';ok=0;Bfs(sx,sy);a[x1][y1]=tmp1;a[x2][y2]=tmp2;a[x3][y3]=tmp3;if(ok==0)return 1;}}}}}}
}
int main()
{int T_T;scanf("%d",&T_T);while(T_T--){scanf("%d%d%d",&n,&m,&t);for(int i=0;i<n;i++){scanf("%s",a[i]);for(int j=0;j<n;j++){if(a[i][j]=='S'){sx=i;sy=j;}}}ok=0;Bfs(sx,sy);if(ok==0){printf("0\n");}else{if(solve()==1){printf("1\n");continue;}if(solve2()==1){printf("2\n");continue;}if(solve3()==1){printf("3\n");continue;}printf("4\n");}}
}

hdu 1983 Kaitou Kid - The Phantom Thief (2)【Bfs+暴力枚举】相关推荐

  1. hdu 1983 Kaitou Kid - The Phantom Thief (2)

    题意:破解字迷之后,你得知Kid将会在展览开始后T分钟内盗取至少一颗宝石,并离开展馆.整个展馆呈矩形分布,划分为N*M个区域,有唯一的入口和出口(不能从出口进入,同样不能从入口出去).由某个区域可直接 ...

  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. hdu 4587 TWO NODES 暴力枚举+tarjan

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意是拿掉两个点 求最多可以把整个图分成几个联通块 注意到有一个模板是可以通过找割点来快速求出 ...

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

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

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

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

  8. hdu 4771 Stealing Harry Potter#39;s Precious(bfs)

    题目链接:hdu 4771 Stealing Harry Potter's Precious 题目大意:在一个N*M的银行里,贼的位置在'@',如今给出n个宝物的位置.如今贼要将全部的宝物拿到手.问最 ...

  9. HDU 4430 amp; ZOJ 3665 Yukari#39;s Birthday(二分法+枚举)

    主题链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4430 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...

最新文章

  1. 转:openTSDB 2.0 安装
  2. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)
  3. mysql 授权 失败_完美解决mysql客户端授权后连接失败的问题
  4. GitLab容器注册服务已集成于Docker容器
  5. 关于HAL.DLL文件丢失导致系统无法启动的问题
  6. Xshell远程连接Linux无法成功连接
  7. 手把手教你搭建属于自己的服务器
  8. 10 本 O'Reilly 出版的免费好书
  9. Why WebRTC|前世今生
  10. 计算机知识动画小学,电脑动画
  11. 转:Cookie MappingRTB,SSP,DSP,Ad Exchange
  12. 5. 统计学基础2:协方差、相关系数、协方差矩阵
  13. JavaSE_第4章 数组
  14. 当前时间戳(SimpleDateFormat)
  15. h5接微信js-sdk的详细步骤
  16. 让自己的博客可以在百度上搜索到
  17. Minio 图片永久访问的问题处理
  18. 使用node ftp上传文件夹到
  19. 揭开家乐福赚钱内幕----家乐福是洋超市里的狼!
  20. simulink封装子系统(mask subsystem)车道保持辅助系统曲率预览器封装

热门文章

  1. 爬取北京链家二手房(requests和selenium)
  2. 流程图和火车程序Jackson图
  3. 前端传来的图片并保存_前端处理后端接口传递过来的图片文件
  4. 项目管理概念——projects、programs、portfolio、operations以及OPM
  5. 负重前行的电信运营商
  6. Microsoft word 中的题注修改后更新的问题
  7. 解决WPS字体的问题
  8. 【BZOJ】 2049 SDOI洞穴探险 【乱搞】
  9. 期货接盘(期货接盘什么意思)
  10. Python小游戏-Las Vegas Black Jack- CASINO (21点)