趣味算法------跟踪机器人

        这道题并不是真正意义上的控制机器人算法,而是根据输入输出文本信息来表达机器人所在位置。

        

题目描述


机器人围绕二维网格移动。开始时,它位于 [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下标。那么细想一下,这道题跟角度转向有关,那么我们是不是也可以仅用角度或者任意四个数字来表示方向呢?

大家可以自己试一下。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值