HDU 4528
一直在纠结怎么样表示找到了人,,,开始时竟灰笨得设两个BOOL。后来参考别人的可以使用二进制位。
另外,此处有一个剪枝就是,就到达该点之后的状态的found(即找到人的状态)在之前已出现过,可以剪去。
- #include <iostream>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- using namespace std;
- bool flag[105][105][4];
- char map[105][105];
- int see[105][105];
- int n,m,lim,sx,sy;
- int dir[4][2]={
- {0,1},
- {0,-1},
- {1,0},
- {-1,0}
- };
- struct Status{
- int x,y;
- int found,cnt;
- Status(){
- found=0;
- }
- };
- void Init(){
- memset(see,0,sizeof(see));
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- if(map[i][j]=='S'){
- sx=i,sy=j;
- }
- if(map[i][j]=='X') continue;
- int ii=i,jj=j;
- while(jj>=1&&(map[ii][jj]=='.'||map[ii][jj]=='S')) jj--;
- if(jj>=1&&map[ii][jj]=='D') see[i][j]|=1;
- if(jj>=1&&map[ii][jj]=='E') see[i][j]|=2;
- ii=i,jj=j;
- while(jj<=m&&(map[ii][jj]=='.'||map[ii][jj]=='S')) jj++;
- if(jj<=m&&map[ii][jj]=='D') see[i][j]|=1;
- if(jj<=m&&map[ii][jj]=='E') see[i][j]|=2;
- ii=i,jj=j;
- while(ii<=n&&(map[ii][jj]=='.'||map[ii][jj]=='S')) ii++;
- if(ii<=n&&map[ii][jj]=='D') see[i][j]|=1;
- if(ii<=n&&map[ii][jj]=='E') see[i][j]|=2;
- ii=i,jj=j;
- while(ii>=1&&(map[ii][jj]=='.'||map[ii][jj]=='S')) ii--;
- if(ii>=1&&map[ii][jj]=='D') see[i][j]|=1;
- if(ii>=1&&map[ii][jj]=='E') see[i][j]|=2;
- }
- }
- }
- bool ok(int x,int y){
- if(x>=1&&x<=n&&y>=1&&y<=m) return true;
- return false;
- }
- bool slove(){
- memset(flag,false,sizeof(flag));
- Status s,t;
- s.x=sx,s.y=sy,s.found=see[s.x][s.y],s.cnt=0;
- // cout<<s.found<<endl;
- queue<Status>que;
- que.push(s);
- while(!que.empty()){
- s=que.front();
- que.pop();
- if(s.cnt>lim) return false;
- else if(s.found==3){ printf("%d\n",s.cnt); return true; }
- flag[s.x][s.y][s.found]=true;
- for(int i=0;i<4;i++){
- t=s;
- t.x=s.x+dir[i][0];
- t.y=s.y+dir[i][1];
- if(map[t.x][t.y]=='D'||map[t.x][t.y]=='E'||map[t.x][t.y]=='X'||!ok(t.x,t.y)) continue;
- t.found|=see[t.x][t.y];
- if(flag[t.x][t.y][t.found]) continue;
- flag[t.x][t.y][t.found]=true;
- t.cnt++;
- que.push(t);
- }
- }
- return false;
- }
- int main(){
- int T,t=0;
- scanf("%d",&T);
- while(T--){
- scanf("%d%d%d",&n,&m,&lim);
- for(int i=1;i<=n;i++)
- scanf("%s",map[i]+1);
- Init();
- printf("Case %d:\n",++t);
- if(!slove()){
- puts("-1");
- }
- }
- return 0;
- }
HDU 4528的更多相关文章
- HDU 4528 BFS 小明系列故事——捉迷藏
原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include<iostream> #include<cstring> #inc ...
- C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压
C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...
- HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528 小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/O ...
- HDU 4528 小明系列故事――捉迷藏
广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单 ...
- hdu 4528(搜索好题)
小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
随机推荐
- 【BZOJ 1572】 工作安排
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1572 [算法] 贪心 先将这些工作按截至时间排序 建立一个小根堆,当决策是否完成一项 ...
- 原生JS---5
原生js学习笔记5——BOM操作 什么是BOM BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的.可以与浏览器窗口进行互动的对象结构,BOM由多个对 ...
- [Apple开发者帐户帮助]六、配置应用服务(1.1)Apple Pay:配置Apple Pay(iOS,watchOS)
Apple Pay允许用户在您的应用中购买商品和服务.要将Apple Pay 权利添加到您的App ID,请先创建商家标识符,然后启用Apple Pay并创建付款处理证书. 或者,您可以使用Xcode ...
- c#,Java aes加密
1.c#版本 /// <summary> /// Aes加密解密.c#版 /// </summary> public class BjfxEncryptHelper { /// ...
- BZOJ 2431 逆序对数列 DP
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...
- java线程中断2
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.那么不 ...
- 1、Visual Studio Code安装及Hello Word
一.环境初始化 1.下载 Visual Studio Code对应版本安装 2.下载.NET Core 2.0 SDK安装 3.安装Mono Debug 完成后界面如下: 二.创建控制 ...
- Assembly之instruction之CMP
CMP[.W] Compare source and destinationCMP.B Compare source and destination Syntax CMP src,dst or ...
- SQL Server存储过程作业(二)
阶段1:练习——统计某类型客房的入住客人人数 需求说明 使用存储过程统计在指定类型的客房入住客人的总人数 提示: 存储过程的输入参数是指定的客房类型名称 USE Hotel GO --阶段1:查询入住 ...
- HTTP协议探索之Cache-Control
缓存的存与用的控制 Cache-Control指定了请求和响应遵循的缓存机制.好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担. Cache-Contro ...