题目链接~~>

做题感悟:这题需要逆向思维,先预处理一下就好。

解题思路:先预处理一下将可以看到 D 与 E 的点标记一下,这样 bfs()遍历迷宫时就可以节省很多时间,还要注意:可以重复走走过的点只要用二进制压缩一下就好。

代码:

#include<stdio.h>
#include<iostream>
#include<map>
#include<stack>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std ;
#define lld __int64
const double PI = 3.1415926 ;
const double esp = 1e-4 ;
const int  md= 2810778 ;
const int MX = 105 ;
int n,m,t ;
char s[MX][MX] ;
bool va[MX][MX],vb[MX][MX],vis[MX][MX][5] ;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1} ;
struct node
{int x,y,step,key ;
} ;
bool search(int x,int y) // 判断边界
{if(x<0||y<0||x>=n||y>=m||s[x][y]=='X')return false ;return true ;
}
void init(int dx,int dy,int ex,int ey)// 预处理
{for(int i=dx+1 ;i<n ;i++)if(s[i][dy]=='.')va[i][dy]=true ;else if(s[i][dy]=='S'){va[i][dy]=true ;break ;}else  break ;for(int i=dx-1 ;i>=0 ;i--)if(s[i][dy]=='.')va[i][dy]=true ;else if(s[i][dy]=='S'){va[i][dy]=true ;break ;}else break ;for(int j=dy+1 ;j<m ;j++)if(s[dx][j]=='.')va[dx][j]=true ;else if(s[dx][j]=='S'){va[dx][j]=true ;break ;}else break ;for(int j=dy-1 ;j>=0 ;j--)if(s[dx][j]=='.')va[dx][j]=true ;else if(s[dx][j]=='S'){va[dx][j]=true ;break ;}else  break ;for(int i=ex+1 ;i<n ;i++)if(s[i][ey]=='.')vb[i][ey]=true ;else if(s[i][ey]=='S'){vb[i][ey]=true ;break ;}else  break ;for(int i=ex-1 ;i>=0 ;i--)if(s[i][ey]=='.')vb[i][ey]=true ;else  if(s[i][ey]=='S'){vb[i][ey]=true ;break ;}else break ;for(int j=ey+1 ;j<m ;j++)if(s[ex][j]=='.')vb[ex][j]=true ;else if(s[ex][j]=='S'){vb[ex][j]=true ;break ;}else break ;for(int j=ey-1 ;j>=0 ;j--)if(s[ex][j]=='.')vb[ex][j]=true ;else if(s[ex][j]=='S'){vb[ex][j]=true ;break ;}else  break ;
}
int bfs(int x,int y)
{memset(vis,false,sizeof(vis)) ;int sx,sy,key ;queue<node>q ;node curt,next ;curt.x=x ;curt.y=y ;curt.key=0 ;if(va[x][y])curt.key=curt.key|1 ;if(vb[x][y])curt.key=curt.key|2 ;curt.step=0 ;vis[x][y][curt.key]=true ;q.push(curt) ;while(!q.empty()){curt=q.front() ;q.pop() ;if(curt.step>t) continue ;if(curt.key==3) // 判断是否找到两个人return curt.step ;for(int i=0 ;i<4 ;i++){next.x=sx=curt.x+dx[i] ;next.y=sy=curt.y+dy[i] ;next.key=key=curt.key ;next.step=curt.step+1 ;if(search(sx,sy)&&s[sx][sy]!='D'&&s[sx][sy]!='E'){if((key&1)==0&&va[sx][sy]) // 没看见过第一个人&&在这点可以看见第一个key=key|1 ;if((key&2)==0&&vb[sx][sy]) // 没看见过第二个人&&在这点可以看见第二个人key=key|2 ;if(!vis[sx][sy][key]) // 没有走过这点{vis[sx][sy][key]=true ;next.key=key ;q.push(next) ;}}}}return -1 ;
}
int main()
{int Tx,q=1 ;scanf("%d",&Tx) ;while(Tx--){scanf("%d%d%d",&n,&m,&t) ;int dx,dy,ex,ey,sx,sy ;for(int i=0 ;i<n ;i++){scanf("%s",s[i]) ;for(int j=0 ;j<m ;j++){if(s[i][j]=='D'){dx=i ;dy=j ;}else if(s[i][j]=='E'){ex=i ;ey=j ;}else if(s[i][j]=='S'){sx=i ;sy=j ;}}}memset(va,false,sizeof(va)) ;memset(vb,false,sizeof(vb)) ;init(dx,dy,ex,ey) ;printf("Case %d:\n%d\n",q++,bfs(sx,sy)) ;}return 0 ;
}

HDU 4528 小明系列故事——捉迷藏相关推荐

  1. hdu 4528小明系列故事——捉迷藏

    题目:点击打开链接 宽搜.注意判重.判重导致比赛的时候错了两次. #include <cmath> #include <ctime> #include <iostream ...

  2. hdu4528小明系列故事——捉迷藏(bfs)

    小明系列故事--捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  3. hdu 4501 小明系列故事——买年货 多重背包

    小明系列故事--买年货                                                                          Time Limit: 500 ...

  4. hdu 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total ...

  5. HDU 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  6. HDU 4501 小明系列故事——买年货

    小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tota ...

  7. HDU - 小明系列故事——捉迷藏(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others) Memory Limi ...

  8. 小明系列故事——捉迷藏

    Problem Description 小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了. 一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可 ...

  9. HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)

    题目链接:点击查看 题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件: 途径的序号满足严格递增 小明的女朋友给小明提出了 m 条路径是不允许走的 在满足上述两条 ...

最新文章

  1. 黑马vue---10-11、Vue实现跑马灯效果
  2. linux命令nohup
  3. dosbox更新加载的文件夹
  4. notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了
  5. sudo vi ~/etc/profile 报错E212:Can't open file for writing
  6. 解耦,未解耦的区别_幂等与时间解耦之旅
  7. mysql count(*),count(1)与count(column)区别
  8. redis持久化功能
  9. 怎么把css改成打印,css 打印print
  10. 深入理解继承知识(下)
  11. 基于 RT-Thread Studio的CPK-RA6M4 开发环境搭建指南
  12. 甲骨文提供非常良心的永久免费云主机空间
  13. MAVEN工具篇——maven打包跳过测试
  14. n1服务器系统和小钢炮,教你N1小钢炮系统设置中其他一些应用和服务器的设置的相关方法教程...
  15. matlab求x对应y值,matlab 不知道函数表达式,已知y值求x
  16. 网络游戏服务器开发(一)
  17. RK3568 外接 PCF8563 RTC
  18. 工程训练大赛物流小车_宁大机械学子在工程训练省赛中斩获佳绩,取得历史性突破...
  19. Golang使用qrcode生成二维码,以及生成带logo的二维码
  20. 无法加载静态的图片Failed to load resource: the server responded with a status of 404 (Not Found)

热门文章

  1. An Analysis of Scale Invariance in Object Detection – SNIP解读
  2. 12星座情人圣诞礼物建议
  3. Hessian的入门
  4. C语言程序里全局变量、局部变量、堆、栈内存地址分配
  5. ggplot 图像的保存
  6. cookiejar包_net/http/cookiejar
  7. 深度学习常用的激活函数以及python实现(Sigmoid、Tanh、ReLU、Softmax、Leaky ReLU、ELU、PReLU、Swish、Squareplus)
  8. 如何用 Python 代码绘制赏月美景?
  9. python中imshow函数_Matplotlib库imshow函数
  10. 仓位可参考的定投因子汇总