BFS hdu-4528 小明系列故事——捉迷藏

实验三 Gmapping建图 自主移动机器人第三次实验课,内容包括:(1)turtlebot的gmapping建图;(2)rosbag的使用;(3)gazebo中的gmapping建图。 阅读详情

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4528

题目意思:

给你一个矩阵,'.‘ 表示能通过,’X' 表示不能通过,告诉你S、D、E 的位置。

问你从S出发在规定的时间内,能否同时找到D和E。只要两个人之间没有障碍,就能找到。

解题思路:

BFS,注意记录访问过的节点的时候,要注意状态的确定。

vis[x][y][i][j]是否访问坐标为x,y,且看到D和E的状态。i=0表示没看到D,i=1表示看到了D,j=0表示没看到E,j=1表示看到了E。

贴出一组测试数据:

7 7 19

S。。。。。。

。X。。。。。

。。X。。。。

。。。X。。。

。。。。X。。

。。。。。XD

。。。。。。E

答案为:18


代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF (1<<30)
#define PI acos(-1.0)
using namespace std;


char save[120][120];
bool se[2][120][120],vis[120][120][2][2];
struct Po
{
   int x,y,t;
   bool flag1,flag2;
}s,d,e;
int dir[4][2]={0,-1,1,0,0,1,-1,0};
int n,m,t;

bool check(int x,int y)
{
   if(x<1||x>n||y<1||y>m)
      return false;
   return true;
}

void init(int x,int y,int num)
{
   for(int i=0;i<4;i++)
   {
      int xx=x,yy=y;

      while(true)  //预处理能找到D和E的位置
      {
         xx+=dir[i][0],yy+=dir[i][1];
         if(check(xx,yy)==false||save[xx][yy]=='X')
            break;
         if(num==0&&save[xx][yy]=='E') //注意开始S的位置,应该把它当做.
            break;
         if(num==1&&save[xx][yy]=='D')
            break;
         se[num][xx][yy]=true;
      }
   }
   return ;
}

bool flag;

int bfs()
{
   queue<struct Po>myq;
   s.t=0;
   myq.push(s);

   while(!myq.empty())
   {
      struct Po cur=myq.front();
      myq.pop();

      for(int i=0;i<4;i++)
      {
         int xx=cur.x+dir[i][0],yy=cur.y+dir[i][1],tt=cur.t+1;

         if(tt>t)
            break;
         if(check(xx,yy)==false||save[xx][yy]!='.')
            continue;
         struct Po temp;
         if(se[0][xx][yy]||cur.flag1) //如果前面已找到了D,或者当前恰好找到了D
            temp.flag1=true;
         else
            temp.flag1=false;

         if(se[1][xx][yy]||cur.flag2)
            temp.flag2=true;
         else
            temp.flag2=false;

         if(temp.flag1&&temp.flag2)
         {
            flag=true;
            return tt;
         }
         if(vis[xx][yy][temp.flag1][temp.flag2]) //状态前面已经找了
            continue;

         temp.x=xx,temp.y=yy,temp.t=tt;
         vis[xx][yy][temp.flag1][temp.flag2]=true;
         myq.push(temp);
      }
   }
   return -1;
}

int main()
{
   int tt;

   scanf("%d",&tt);
   for(int ca=1;ca<=tt;ca++)
   {
      scanf("%d%d%d",&n,&m,&t);
      for(int i=1;i<=n;i++)
      {
         scanf("%s",save[i]+1);
         for(int j=1;j<=m;j++)
         {
            if(save[i][j]=='S')
               s.x=i,s.y=j;
            if(save[i][j]=='D')
               d.x=i,d.y=j;
            if(save[i][j]=='E')
               e.x=i,e.y=j;
         }
      }
     // printf("s:%d %d  e:%d %d  d:%d %d\n",s.x,s.y,e.x,e.y,d.x,d.y);
      memset(se,false,sizeof(se));
      init(d.x,d.y,0); //预处理能够看见的D的坐标
      init(e.x,e.y,1); //预处理能够看见的E的坐标

      flag=false;
      if(se[0][s.x][s.y])
         s.flag1=true;
      else
         s.flag1=false;
      if(se[1][s.x][s.y])
         s.flag2=true;
      else
         s.flag2=false;
      printf("Case %d:\n",ca);
      if(s.flag1&&s.flag2)
      {
         printf("0\n");
         continue;
      }
      memset(vis,false,sizeof(vis));
      vis[s.x][s.y][s.flag1][s.flag2]=true;
      int ans=bfs();
      if(flag==false)
         printf("-1\n");
      else
         printf("%d\n",ans);
   }

   return 0;
}



华为OD机考2025B卷 - 报文响应时间(Java & Python& JS & C++ & C ) 华为OD机考2025B卷 - 报文响应时间 阅读详情

相关推荐

CycloneDDS(C++版本)开源代码在Linux(X86平台)系统上编译生成可执行文件的详细步骤

cyclonedds里面已经有现成的实例供我们参考,在根目录下的example目录下面,我们打开此目录,此目录下有CMakeLists.txt文件以及一些其他的文档,我们需要在此目录(example目录)下编译构建出。我们可以看到cyclonedds-cxx-master包下的example目录下有很多文件,包括CMakeLists.txt等,其中我们要构建的可执行文件所需要的源文件等就在。此过程会稍微慢一点。之后会报错,如下:(图片中是c版本出现的问题截图,不影响,c++也是这个影响,问题是一样的)

qq_42595610的博客 1225

小明系列故事——捉迷藏 HDU - 4528 (标记 四种状态,也可以说是四种状态下的最小步数,很好的题)

  小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。  一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:  只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被...

obsorb_knowledge的博客 398

linux那些事之numa balance

numa balance numa balance是页迁移技术最重要也是最开始使用应用的技术,主要是为解决由于调度器进程在两个node迁移造成访问内存性能问题。 numba balance通过页迁移技术,将不在运行节点的内存迁移到所运行的节点上。对应numa balance要注意几点: 防止进程在两个节点之前来回切换造成频繁进行页迁移(ping pang现场)从而影响性能。numa balance本身就是为了提高性能,不能因为造成频繁页迁移而对性能进行一个反向优化。 多个线程分布在不同线程 访.

weixin_42730667的博客 3861

hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解

思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改。 注意坑点:S的位置是可以走的 代码: #include<queue> #include<cstdio> #define ll long long using namespace std; const int N = 100+5; ...

weixin_34253539的博客 168

HDU4528+BFS

#include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;stdlib.h&gt; #include&lt;algorithm&gt; #include&lt;iostream&gt; #include&lt;queue&gt; #include&lt;stack&gt; #include&lt;math.h&gt;

xxx0624 238

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

题目:点击打开链接 宽搜。注意判重。判重导致比赛的时候错了两次。 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using names

1689

2017.1.18【初中部 】普及组模拟赛C组 捉迷藏 题解

原题:http://172.16.0.132/junior/#contest/show/1368/3题目描述:小x的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三…, 老三自然就叫小x了。 一天,小x的妈妈带兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小x来找其他两个人。现在小x想知道,在规定时间内,自己是否可以找到所有的人,现在

mijoe10的博客 510

HDU 4528 小明系列故事——捉迷藏bfs

小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2804Accepted Submission(s): 838 Problem Description   小明的妈妈生了三个孩子,老大叫大明, 老二叫...

LSD20164388的博客 296

hdu 4528 小明系列故事——捉迷藏 bfs 解题报告

小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1410    Accepted Submission(s): 393 Problem Description   小明的妈妈生了三个孩子,老大叫

小夥的博客 655

BFS】 HDU 4528 小明系列故事——捉迷藏

原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include #include #include #include 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

PWZER 935

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

小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1426    Accepted Submission(s): 397 Problem Description   小明的妈妈生了三个孩子,老大叫大明,

mengxiang000000 737

HDU 4528 小明系列故事――捉迷藏 (很好的BFS)

在用BFS的时候可访问的点要用四个状态去记录,0代表一个都没找到,1代表找到了大明,2代表找到了二明,3代表都找到。 因为在BFS的过程中访问各节点时,因为访问时的状态不同,所以过程中包含有回路。 我的代码: #include #include #include #include using namespace std; const int maxn = 105; struct

Neutralzz的博客 742

HDU 4528 小明系列故事——捉迷藏 bfs

小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。   一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:   只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被...

bibibi724 589

HDU4528 小明系列故事——捉迷藏(BFS)

Problem Description  小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三…, 老三自然就叫小明了。   一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:   只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决...

riba2534的博客 790

小明系列故事——捉迷藏 HDU - 4528 BFS详解

小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。   一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:   只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被...

Accepted 708

HDU-4528 小明系列故事——捉迷藏 BFS模拟

题意:链接 分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状态的值,那么这个数值对应的状态就有四种,BFS搜索即可。之前没有考虑到折回这种情况,原因就是状态没有进行完全的搜索。后面看了网上的写法中多是直接开设了四维的一个状态,只需记录某状态走还是没走,也就没...

weixin_33957648的博客 119

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Problem Description   小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。   ...

ityanger的技术栈 2655

HDU-4528 小明系列故事――捉迷藏

小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三…, 老三自然就叫小明了。   一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:   只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被发现...

slass-mot-odet 612

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

小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 609    Accepted Submission(s): 141 Problem Description   小明的妈妈生了三个孩子,老大叫大

ophunter的专栏 1294

基于PHP的mysql仿中关村在线模拟攒机平台程序源码.zip

基于PHP的mysql仿中关村在线模拟攒机平台程序源码.zip

cadquery, 参数化cad脚本框架.zip

cadquery, 参数化cad脚本框架 什么是 CadQuery? CadQuery是一种直观的easy-to-use python 语言,用于构建参数 3D的CAD模型。 CadQuery是面向 3D CAD的,jQuery是 javascript 。 想象一

上一篇: 欧拉回路 poj-1392 Ouroboros Snake
下一篇: 状压dp hdu-4529-郑厂长系列故事——N骑士问题
Accagain
博客等级 码龄14年 376粉丝 316原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值