这道题并不是真正意义上的控制机器人算法,而是根据输入输出文本信息来表达机器人所在位置。
题目描述
机器人围绕二维网格移动。开始时,它位于 [0, 0],面向东。它由一系列指令控制:
.意味着在当前方向上向前迈出一步。
<表示逆时针旋转 90 度。
>表示顺时针旋转 90 度。
你的工作是处理指令并返回机器人的最终位置。
例如:如果给机器人一个指令序列 ..<.<.,那么:
第 1 步:. 它仍然面向东方,位于 [1, 0]。
第 2 步:. 它仍然面向东方,位于 [2, 0]。
第 3 步:< 它现在朝北,仍然在 [2, 0]。
第 4 步:. 它仍然朝北,位于 [2, 1]。
第 5 步:< 它现在面向西,并且仍然在 [2, 1]。
第 6 步:. 它仍然面向西方,现在位于 [1, 1]。
所以,track_robot("..<.<.")返回 [1, 1]。
输入输出格式
输入格式
第一行有一个字符串,表示一系列指令控制;
输出格式
一行输出数组,表示机器人的最终位置。
输入输出样例1
输入
>>..
输出
[-2, 0]
输入输出样例2
输入
<>>>><><<<><>>>><><<<><>>><>
输出
[0, 0]
说明提示
指令字符串将只包含三个有效字符 .,<或>。
您将始终收到一个字符串(但该字符串可能为空)
思路:
由于题目很简单,我就简单的提一点:
类似于上篇走迷宫文章, 我们可以定义一个方向数组,相同点都是需要有四个方向,不同点就是走迷宫方向顺序是无所谓的,但是这道题为了方便我们需要将四个方向依次按照逆时针方向(顺时针方向依次储存),也就是必须有序。定义一个index整型数据来记录指向方向数组的元素下标(0,1,2,3),不同的下标对应不同的方向。
具体代码:
#include<stdio.h>
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//逆时针存储四个方向。
int main(void)
{
int start[2] = {0,0};//初始位置。
int index = 0;//当先所处的方向下标。
char c;//接受输入数据。
while(scanf("%c",&c) != EOF)
{
if(c == '.')
{
start[0]+=dir[index][0];
start[1]+=dir[index][1];//如果是‘.’,在对应方向上前进一格。
}
else
{
if(c == '<')
index = (index+1)%4;//因为方向数组存储的方向是按逆时针方向的,所以需要逆时针旋转90°时,index需要加1,并且取模4,防止越界。
else
index = index-1<0?3:index-1; //顺时针旋转90°需要自减1,并且如果index下标越界后,index只能是3(因为index只减去1),如果不越界的话则自身减1即可。
}
}
printf("[%d, %d]\n",start[0],start[1]);//输出结果。
}
总结:
这道题很简单,有助于帮助理解“方向”,对于动态规划以及图等问题常常涉及方向的概念。
实际上这道题还可以更简单,只是为了方便理解引入了反向数组以及index下标。那么细想一下,这道题跟角度转向有关,那么我们是不是也可以仅用角度或者任意四个数字来表示方向呢?
大家可以自己试一下。