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 ...
随机推荐
- diff比较两个文件的差异
1.diff -ruN a.txt b.txt>patch.txt比较第二个文件与第一个文件相比的变化,并将变化添加到patch.txt文件中,-表示删除的行,+表示添加的行 2.下面的,“&l ...
- CMMI的SG/GG概念区别与SP/GP概念的区别
每一个 “流程区域” 会细分为多个子目标.若该子目标只对应单一的流程区域,称为 “特定目标(Specific goal)”:若子目标会涵跨多个流程区域,则称为 “一般目标(Generic goal)” ...
- 联想Thinkpad L460安装Win7 64位
单位发了L460,自带的系统为win10,但是涉及到很多工作以及客户都是在win7环境下,所以必须安装win7的系统,经过一番折腾,终于装好了. 主要顺序如下: 1,制作WINPE启动盘,如大白菜,老 ...
- php导出mysql源码
件名:db_backup.php 源代码如下: 复制代码 代码如下: <?php ini_set("max_execution_time", "180") ...
- springboot创建项目
Springboot作为轻量级快速开发受到无数java人的青睐,Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过 ...
- C++中const用法
1.const和指针: 如果const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greet[] = “He ...
- Java 网络IO编程(BIO、NIO、AIO)
本概念 BIO编程 传统的BIO编程 代码示例: public class Server { final static int PROT = 8765; public static void main ...
- Python定制容器
Python 中,像序列类型(如列表.元祖.字符串)或映射类型(如字典)都是属于容器类型,容器是可定制的.要想成功地实现容器的定制,我们需要先谈一谈协议.协议是什么呢?协议(Protocols)与其他 ...
- Lua Time
-- local getTime = os.date(“%c”); -- %a abbreviated weekday name (e.g., Wed)-- %A full weekday name ...
- HTTPS 为什么更安全,先看这些
HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 HTTP 协议和 SSL/TLS 的组合.理解 HTTPS 之前有必要弄清楚一些密码学的相关基础概念,比如:明文.密文.密码.密钥 ...