HDU 4528 BFS 小明系列故事——捉迷藏
原题直通车:HDU 4528 小明系列故事——捉迷藏
分析: 标记时加两种状态就行.
代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std; const int maxn=101;
char f[maxn][maxn];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
bool vis[maxn][maxn][2][2];
int n,m,k,ei,ej,di,dj,si,sj;
struct node{
int x,y,time,p,q;
}rt,ne;
void work(node &rt){
bool u;
if(!rt.p&&rt.x==ei){
int a=min(rt.y,ej), b=max(rt.y,ej);
u=false;
for(int i=a+1;i<b;++i)
if(f[ei][i]!='.') u=true;
if(!u)rt.p=1;
}
if(!rt.p&&rt.y==ej){
int a=min(rt.x,ei), b=max(rt.x,ei);
u=false;
for(int i=a+1;i<b;++i)
if(f[i][ej]!='.') u=true;
if(!u)rt.p=1;
}
if(!rt.q&&rt.x==di){
int a=min(rt.y,dj), b=max(rt.y,dj);
u=false;
for(int i=a+1;i<b;++i)
if(f[di][i]!='.')u=true;
if(!u)rt.q=1;
}
if(!rt.q&&rt.y==dj){
int a=min(rt.x,di), b=max(rt.x,di);
u=false;
for(int i=a+1;i<b;++i)
if(f[i][dj]!='.') u=true;
if(!u)rt.q=1;
}
}
int BFS(){
queue<node>M;
rt.x=si, rt.y=sj, rt.time=0, rt.p=0, rt.q=0;
vis[si][sj][0][0]=true;
M.push(rt);
while(!M.empty()){
rt=M.front(); M.pop();
work(rt);
if(rt.p&&rt.q) return rt.time;
for(int i=0;i<4;++i){
ne=rt; ne.x+=dx[i]; ne.y+=dy[i]; ne.time+=1;
if(ne.x<0||ne.x>=n||ne.y<0||ne.y>=m||ne.time>k||f[ne.x][ne.y]!='.') continue;
if(!vis[ne.x][ne.y][ne.p][ne.q]){
M.push(ne);
vis[ne.x][ne.y][ne.p][ne.q]=true;
}
}
}
return -1;
}
int main(){
int T,i,j,t,u,cas=1; scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<n;++i){
scanf("%s",f[i]);
for(j=0;j<m;++j){
if(f[i][j]=='S') si=i, sj=j,f[i][j]='.';
if(f[i][j]=='E') ei=i, ej=j;
if(f[i][j]=='D') di=i, dj=j;
for(t=0;t<2;++t)
for(u=0;u<2;++u)
vis[i][j][t][u]=false;
}
}
printf("Case %d:\n%d\n",cas++,BFS());
}
return 0;
}
HDU 4528 BFS 小明系列故事——捉迷藏的更多相关文章
- C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压
C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...
- HDU 4828 小明系列故事——捉迷藏
漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others) Memo ...
- hdu4528 小明系列故事——捉迷藏
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s ...
- HDU 4528 小明系列故事――捉迷藏
广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单 ...
- HDU-4528 小明系列故事——捉迷藏 BFS模拟
题意:链接 分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状 ...
- hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解
思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改. 注意坑点:S的位置是可以走的 代码: #include<queue ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 4542 小明系列故事——未知剩余系
小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...
- HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
随机推荐
- 谨防“USB杀手”
应对来历不明的U盘要小心,因为可能被植入恶意程序或木马,这点相信许多人都知道. 但近两年又出现了一种新的新威胁,下图是一款名为USB Killer的设备,可对电脑硬件造成物理破坏. 它的使用效果很简单 ...
- 洛谷P3857 [TJOI2008]彩灯 [线性基]
题目传送门 彩灯 题目描述 Peter女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜.已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们.从数学的角度看,这一排彩灯的任何一 ...
- go chapter 11 初始化 map 数组
// 初始化 map m1 = make(map[string]string) // 初始化 数组 var array3 = []int{9, 10, 11, 12} var a [4]int a[0 ...
- Xcode代码提示里的字母含义
P -- 协议 M -- 成员方法 C -- 类 K -- 枚举 .常量 V -- 成员变量 T -- typedef类型 G -- 全局变量 f -- 函数 # -- #define指令
- Problem F: 深入浅出学算法007-统计求和
Description 求含有数字a且不能被a整除的4位整数的个数,并求这些整数的和 Input 多组测试数据,先输入整数T表示组数然后每组输入1个整数a(1<=a<=9) Output ...
- bzoj 3809 莫队
收获: 1.分块时顺便记录每个位置所属的块,然后一次排序就OK了. 2.要权衡在“区间移动”与“查询结果”之间的时间,莫队算法一般区间移动频率远大于查询结果,所以我们选择的辅助数据结构时就要注意了,我 ...
- Delphi TFileStream 打开模式与共享模式
{ TFileStream create mode } fmCreate = $FF00; { Create a file with the given name. If a file with th ...
- Surface Mount Package Details
http://www.centralsemi.com/product/packages/index2.php http://www.infineon.com/cms/cn/product/packag ...
- mysqlslap
常用参数[options]详细介绍: --concurrency代表并发数量,多个可以用逗号隔开.例如:--concurrency=50,200,500 --engines代表要测试的引擎,可以有多个 ...
- 【QQ输入法】QQ输入法输入的英文字母顺便空格很大
正常的输入出来是这个样子的: 现在变成了这个样子: 怎么解决这个问题呢: 快捷键 shift+空格 即可解决