[GDOI22pj2D] 机器人
第四题 机器人
提交文件: robot.cpp
输入文件: robot.in
输出文件: robot.out
时间空间限制: 3 秒, 512 MB
刚上初一的小纯特别喜欢机器人,这周末,她报名了学校的“小机器人俱乐部”,而进入俱乐部需要通过一场考试。
考试场地可以看作一个$ n × m$ 的网格图,行从上往下标号为 \(1, · · · , n\),列从左往右标号为 \(1, · · · , m\)。每个格子有三种可能:空地,障碍物,机器人(有且只有一个),分别用“.”、“*”、“R”表示。现在小纯需要控制机器人在考试场地上行走,她每秒可以发送一条指令,为“W”——往上走、“S”——往下走、“A”——往左走、“D”——往右走的其中之一。由于俱乐部的机器人是避障机器人,当机器人接收到一条指令的时候,如果即将到达的位置为障碍物,那么机器人将留在原地,否则机器人向对应方向走一步。如果其走出边界则考试失败(例如在第一行发送指令向上走)。
为了增加考试的难度,俱乐部提供的机器人的信号接收器都存在问题。换言之,对于小纯给出的每一条指令,机器人有可能接收到指令并执行,也有可能接收不到指令并保持不动.
现在小纯提供了一个指令序列,她想知道,这个指令序列是否存在某些情况使得这个指令序列走出边界。
输入格式
每个测试点包含多组数据。
第一行一个正整数 T,表示数据组数。
对于每组数据:
第一行一个由“W,S,A,D”组成的字符串 S,表示小纯的指令序列。
第二行两个正整数 n, m 表示考试场地的长度和宽度。
接下来 n 行,每行一个长度为 m 的字符串,描述考试场地。
输出格式
对于每组数据,输出一行。“YES”表示可能走出考试场地,“NO”表示不可能走出场地。(不包含引号)
样例数据
2
DWAWAADWASDSWSS
8 8
.***...*
**....*.
**...**.
**.*.***
......**
.*..*..*
*...**R*
...*..**
DWAWAADWASDSWSS
8 8
.***...*
**....*.
**...**.
**.*.***
......**
.*..*..*
*...**R*
..**..**
YES
NO
数据范围
令 |S| 表示指令序列长度。对于所有测试点,\(1 ≤ T ≤ 10,1 ≤ |S| ≤ 10^5,1 ≤ n, m ≤ 500\)。
| 测试点 | $|S| ≤ $ | \(n, m ≤\) |
|---|---|---|
| 1 ∼ 4 | \(15\) | 10 |
| 5 ∼ 6 | $ 50$ | 50 |
| 7 ∼ 10 | \(1000\) | 50 |
| 11 ∼ 14 | \(10^5\) | 70 |
| 15 ∼ 20 | $ 10^5$ | 500 |
首先我们尝试按照运行到了哪条指令来看,到了那条指令后,所有之前到过的点都可以往指令指的方向走一步(如果没有障碍物的话)。解释一下,因为之前到过的点都可以一直留在那里,等到这个指令再走。因此也可以发现,如果一个地方之前到过,那就没有必要再走了。但这样复杂度还是很大。
我们还可以发现,一个之前往上走过的店,第二次就不用再往上走了,因为那个点肯定到过了。所以我们开四个队列存储还没有往上下左右走过的店,每次到了一个新的点,那就给他在四个队列里都装上。这样可以达到\(O(|s|+n^2)\)的复杂度。如果一走出去那就输出"YES"。
#include<cstdio>
#include<cstring>
const int N=505,M=1e5+5,dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
struct node{
int x,y;
}q[N*N][4];//0上1下2左3右
int v[N][N],t,n,m,len,x,y,f,l[4],r[4],k,l1,r1;
char s[M],mp[N];
int notok(int x,int y)
{
return x<1||x>n||y<1||y>m;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s%d%d",s+1,&n,&m);
len=strlen(s+1);
memset(v,f=0,sizeof(v));
for(int i=1;i<=n;i++)
{
scanf("%s",mp+1);
for(int j=1;j<=m;j++)
{
if(mp[j]=='*')
v[i][j]=1;
if(mp[j]=='R')
x=i,y=j;
}
}
q[l[0]=r[0]=1][0]=q[l[1]=r[1]=1][1]=q[l[2]=r[2]=1][2]=q[l[3]=r[3]=1][3]=(node){x,y};
for(int i=1;i<=len;i++)
{
if(s[i]=='W')
k=0;
else if(s[i]=='S')
k=1;
else if(s[i]=='A')
k=2;
else
k=3;
l1=l[k],r1=r[k],l[k]=r[k]+1;
for(int j=l1;j<=r1;j++)
{
x=q[j][k].x+dx[k],y=q[j][k].y+dy[k];
if(!v[x][y])
{
if(notok(x,y))
{
f=1;
break;
}
q[++r[1]][1]=q[++r[2]][2]=q[++r[3]][3]=q[++r[0]][0]=(node){x,y},v[x][y]=1;
}
}
if(f)
break;
}
if(f)
printf("YES\n");
else
printf("NO\n");
}
}
[GDOI22pj2D] 机器人的更多相关文章
- 【翻译】用AIML实现的Python人工智能聊天机器人
前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...
- 3.C#面向对象基础聊天机器人
基于控制台的简单版的聊天机器人,词库可以自己添加. 聊天机器人1.0版本 源码如下: using System; using System.Collections.Generic; using Sys ...
- Python 简易聊天机器人
聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...
- java 聊天猜拳机器人
2016-12-06本随笔记录第一次制作经过,感谢各位大神指导. 工具:eclipse;JAVA JDK; 语言:java 时间:2016.11.23 作者:潇洒鸿图 地址:http://www.cn ...
- 用VB实现SmartQQ机器人
这里为了便于介绍程序设计的流程,更多以代码形式给出,具体可用火狐浏览器的firebug插件来抓包分析,或者用谷歌浏览器的开发者工具进行抓包.抓包地址是:http://w.qq.com 第一步,是二维码 ...
- PHP 检测机器人,屏蔽内页
PHP 检测机器人,屏蔽内页 <?php // SpiderHelper::rewrite301(); // SpiderHelper::showRobotTxt(); class Spider ...
- vijos1250 最勇敢的机器人
背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n个物品,每个物品都有一个价 ...
- 【chrome插件】web版微信接入图灵机器人API实现自动回复
小贱鸡自动回复API已经不可以用了,现在改良接入图灵机器人API 360chrome浏览器团队翻译了部分谷歌插件开发文档 地址:http://open.chrome.360.cn/extension_ ...
- 一步一步来做WebQQ机器人-(五)(发送消息||完结)
× 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个 ...
- 机器人操作臂运动学入门一--D-H参数标定
最近重新学习机器人方面的知识,想到一年以前在学校选修<机器人学技术基础>这门课的时候,老师虽然讲机器人的各个方面的知识都讲到了,但只是浮光绿影的的提到,并没有真正讲到深处,我的理解也没有更 ...
随机推荐
- Linux查看磁盘空间,文件系统、挂载
Linux磁盘空间,文件系统.挂载 概述 在使用以下命令查看磁盘使用情况时 df -h du -sh 目标路径 作为初级开发者,Linux入门级选手,可能不禁要问Linux系统的文件系统跟window ...
- 细聊C# AsyncLocal如何在异步间进行数据流转
前言 在异步编程中,处理异步操作之间的数据流转是一个比较常用的操作.C#异步编程提供了一个强大的工具来解决这个问题,那就是AsyncLocal.它是一个线程本地存储的机制,可以在异步操作之间传递数据. ...
- fastapi启动后访问docs不显示页面的问题
笔者之前正常使用fastapi的docs接口进行各种接口调试,使用很正常,之前安装也都是正常安装流程,没有做任何修改,可以突然有一天不知道为啥,docs接口打开是空白的,接口也没有报错,就是空白,摸索 ...
- 使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介
前世今生 OpenTracing OpenTracing 项目启动于 2016 年,旨在提供一套分布式追踪标准,以便开发人员可以更轻松地实现分布式追踪. OpenTracing 定义了一套 Traci ...
- Solution -「ARC 103B」Robot Arms
Description Link. 给定 \(n\) 组坐标.构造长度为 \(m\) 的序列 \(\{c_n\}\) 和 \(n\) 组包含 LRUD 的路径,满足对于每一组坐标: \(c_i\) 表 ...
- python爬虫——爬取天气预报信息
在本文中,我们将学习如何使用代理IP爬取天气预报信息.我们将使用 Python 编写程序,并使用 requests 和 BeautifulSoup 库来获取和解析 HTML.此外,我们还将使用代理服务 ...
- Xshell远程连接、MBR/BOOT和GRUB三者关系总结(系统启动过程)
远程连接 远程连接Linux服务器的常见工具有Xshell.SecureCRT.Putty等,这些客户端连接工具在Linux服务器对应着相同SSH服务进程sshd,即远程连接都是使用SSH协议,当然它 ...
- python-手机自动化环境部署
关于ui-automator,google的官方介绍: https://developer.android.google.cn/training/testing/ui-automator https: ...
- C、C++函数和类库详解(VC++版)(2016-06-26更新)
C.C++函数和类库详解(VC++版)(未完成) 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系 ...
- Kubernetes文档支持的版本
简介 https://kubernetes.io/zh-cn/docs/ 官方中文网站一共是可以阅读5个k8s版本的文档.这5个版本包括k8s最新版和最近的4个版本.例如当前最新版是1.28,那么文档 ...