[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参数标定
最近重新学习机器人方面的知识,想到一年以前在学校选修<机器人学技术基础>这门课的时候,老师虽然讲机器人的各个方面的知识都讲到了,但只是浮光绿影的的提到,并没有真正讲到深处,我的理解也没有更 ...
随机推荐
- typora使用教程&高级用法&Markdown
typora使用教程&高级用法&Markdown typora介绍 哇啦哇啦哇啦哇,,,,,,,,,,,,, 提示:小白看不懂的话,建议哔哩哔哩搜索"遇见狂神说", ...
- Redis从入门到放弃(11):雪崩、击穿、穿透
1.前言 Redis作为一款高性能的缓存数据库,为许多应用提供了快速的数据访问和存储能力.然而,在使用Redis时,我们不可避免地会面对一些常见的问题,如缓存雪崩.缓存穿透和缓存击穿.本文将深入探讨这 ...
- iOS交叉编译
编译objc程序 ~/toolchain4/pre/bin/arm-apple-darwin9-gcc -arch arm -lobjc -framework CoreFoundation -fram ...
- web组态可视化编辑器
随着工业智能制造的发展,工业企业对设备可视化.远程运维的需求日趋强烈,传统的单机版组态软件已经不能满足越来越复杂的控制需求,那么实现web组态可视化界面成为了主要的技术路径. 行业痛点 对于软件服务商 ...
- RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示
前言 上一篇,移植应用前的通讯接口工作和全屏工作都已经完成了.本篇移植开发的商业应用. 交叉编译好应用 (略),参照<RK3568开发笔记(八):开发板烧写buildroot固件(支 ...
- slate源码解析(三)- 定位
接口定义 能够对于文字.段落乃至任何元素的精准定位 并做出增删改查,都是在开发一款富文本编辑器时一项最基本也是最重要的功能之一.让我们先来看看Slate中对于如何在文档树中定位元素是怎么定义的[源码] ...
- 中华人民共和国企业所得税月(季)度预缴纳税申报表(A类,2018年版)
企业按照<中华人民共和国公司法>有关规定整体改制,包括非公司制企业改制为有限责任公司或股份有限公司,有限责任公司变更为股份有限公司,股份有限公司变更为有限责任公司,原企业投资主体存续并在改 ...
- 2020/4/26 2-sat 学习笔记
2-sat 吧.... 其实我jio得它一点都不难 嗯 2-sat是个啥东西呢?其实就是有很多人,他们每个人有两个要求,一个要求可以说是要求一个数为0或1而对于第i个数,我们可以选择为0或为1最终询问 ...
- CF1368B
题目简化和分析: 因为要求长度最小,所以我们每个字符就应该发挥最大的价值,不会有没有作用的字符. 设有 \(x_1\) 个 \(c\) ,\(x_2\) 个 \(o\) ,\(x_3\) 个 \(d\ ...
- 利用Zip.js压缩并上传文件,后端使用.Net(Winform)接收转存
没时间解释了,快上车... 前端js: upload=function () { if(window.FormData) { var fileslist=$("input[type='fil ...