[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参数标定
最近重新学习机器人方面的知识,想到一年以前在学校选修<机器人学技术基础>这门课的时候,老师虽然讲机器人的各个方面的知识都讲到了,但只是浮光绿影的的提到,并没有真正讲到深处,我的理解也没有更 ...
随机推荐
- 领域驱动设计(DDD):从基础代码探讨高内聚低耦合的演进
大家好,我是付威,一名已在编码第一线奋斗了十余年的程序员.在2019年我初次接触到领域驱动设计(Domain-Driven Design,简称DDD)的概念.在我的探索中,我发现许多有关DDD的教程过 ...
- [Love] VSCODE 调试 LOVE 引擎游戏
VSCODE调试LOVE引擎游戏 安装插件 配置插件 按 CTRL + SHIFT + P,打开Preferences: Open User Settings (JSON),为settings.jso ...
- 《SQL与数据库基础》03. SQL-DML
目录 DML 数据插入 数据删除 数据更新 本文以 MySQL 为例 DML 数据插入 给指定字段添加数据: INSERT INTO 表(字段1, 字段2, ......, 字段n) VALUES(值 ...
- IDEA 配置桌面快捷方式
IDEA 配置桌面快捷方式 目录 IDEA 配置桌面快捷方式 1.下载idea.tar解压 2.配置快捷方式 3.为什么要存放在这个目录? 1.下载idea.tar解压 tar xf ideaIC-2 ...
- 深入分布式一致性:Raft 和 etcdRaft
分布式一致性是构建可靠的分布式系统的关键要素之一.为了确保数据的一致性和可用性,一致性算法的设计变得至关重要.在这篇博文中,我们将深入探讨两个与分布式一致性密切相关的主题:Raft 算法和 etcdR ...
- Longest Divisors Interval
Smiling & Weeping ----总有一个人, 一直住在心底, 却消失在生活里. Given a positive integer n, find the maximum size ...
- Python基础语法--课程笔记
Smiling & Weeping ----我的心是旷野的鸟,在你的眼睛里找到了它的天空 定义和使用类: 1.声明类: class类名: 成员变量,成员函数 2.定义类的对象: 对象名 = 类 ...
- 开源通用型流式大数据统计系统XL-LightHouse介绍
概述 XL-LightHouse是针对互联网领域繁杂的流式数据统计需求而开发的一套集成了数据写入.数据运算.数据存储和数据可视化等一系列功能,支持大数据量,支持高并发的[通用型流式大数据统计平台]: ...
- Navicat连接MySQL,出现2059 - authentication plugin 'caching_sha2_password'的解决方法
cmd(管理员)登录mysql执行如下 ALTER USER 'YOURUSERNAME'@'localhost' IDENTIFIED WITH mysql_native_password BY ' ...
- Codechef - Maximize Colours(IQ)
题目大意 有红绿蓝三种颜色,三种颜色当中任意两个颜色混合都可以产生出一个新的颜色(然而混合产生的颜色不能与任何其它的颜色进行混合).输入三个整数,分别代表红色,绿色,蓝色的颜色个数(每次混合各消耗 ...