遥控小车

题目描述

爸爸给小明买了一个玩具小车,是通过手柄遥控的,小明在一个房间里面用手柄控制小车,手柄上面的按键有启动键、停止键、四个方向键和一个加速键。已知小车的正常速度为1个单位长度/秒,当第一次按下加速键后,速度变为原来的两倍,即2个单位长度/秒,当下一次按下加速键的时候,速度就恢复为初始的正常速度,再次按下的时候又会加速,依次类推。
为了简单起见,该房间可以看作一个边长为50个单位长度的正方形,且把左下角的坐标视为(0,0),即原点,默认小车的起始位置始终都在原点。
在某个时刻,小明按下启动键,此时记为0时刻,小车就默认向上方出发,小明可以在小车运行的过程中,通过按键改变小车的方向(上,下,左,右),也可以通过按加速键使小车加速或者恢复正常的速度,经过50秒后按下停止键,求此时小车的坐标。
由于这个房间的四周都是墙壁,如果某个时刻小车运行到墙壁边缘,且方向是面对墙壁的,那么小车是没有办法继续前进的,只能在原地挣扎直到小明通过按键改变它的方向。


输入

每个测试样例第一行为一个正整数n(n<=20)表示在小车运行中小明对于小车的控制操作次数,当n为0时,测试结束。
接下来有n行,每行有一个整数k(0<k<50)和一个字符c(c只能为U、D、L、R、A中的一种)。其中k代表操作小车的时刻,c代表操作的类型,U代表方向向上,D代表方向向下,L代表方向向左,R代表方向向右,A代表加速或者恢复原来的速度。


输出

每一个样例对应的输出为一行,输出停止键按下时小车的坐标。输出格式为整数m和整数n(0<=m,n<=50),代表小车的横坐标和纵坐标。


样例输入

1
30 R
4
10 D
20 A
30 A
40 L
0

样例输出

20 30
0 0

说明:此题和机器人行走问题,大同小异
 
      
AC代码如下:
#include <iostream>
#include "stdio.h"
#include "string.h"
#include"math.h"
using namespace std;

int main(int argc, char* argv[])
{
    int a[100];
    char b[100];
    int c[100];//记录小车的n+1个状态(n次操作)
    int x,y;//横,纵坐标
    int i;
    int flag[100];//记录小车第i个状态的速度
    int u,d,l,r;//标记小车上下左右四个方位移动的距离
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        u=d=l=r=0;//初始化坐标
        c[0]=1;
        //初始化最初状态
        flag[0]=1;//;初始化最初速度
        for (i=0;i<n;i++)
        {
            scanf("%d %c",&a[i],&b[i]);
        }
        for (i=1;i<=n;i++)
        {
            if (b[i-1]=='U')
            {
                c[i]=1;
                flag[i]=flag[i-1];
            }
            else if (b[i-1]=='D')
            {
                c[i]=2;flag[i]=flag[i-1];
            }
            else if (b[i-1]=='L')
            {
                c[i]=3;flag[i]=flag[i-1];
            }
            else if (b[i-1]=='R')
            {
                c[i]=4;flag[i]=flag[i-1];
            }
            else if (b[i-1]=='A')
            {
                c[i]=c[i-1];//方向不变
                if (flag[i-1]==1)//变速
                {
                    flag[i]=2;
                }
                else if (flag[i-1]==2)
                {
                    flag[i]=1;
                }
            }
        }
        for (i=0;i<=n;i++)
        {
            if (i==0)
            {
                u+=a[i]*flag[i];
            }
            else if(i<n)
            {
                if (c[i]==1)
                {
                    u+=(a[i]-a[i-1])*flag[i];//时间间隔 * 速度
                }
                else if (c[i]==2)
                {
                    d+=(a[i]-a[i-1])*flag[i];
                }
                else if (c[i]==3)
                {
                    l+=(a[i]-a[i-1])*flag[i];
                }
                else if (c[i]==4)
                {
                    r+=(a[i]-a[i-1])*flag[i];
                }
            }
            else if (i==n)//计算最后一次操作到50s,小车的运动
            {
                if (c[i]==1)
                {
                    u+=(50-a[i-1])*flag[i];
                }
                else if (c[i]==2)
                {
                    d+=(50-a[i-1])*flag[i];
                }
                else if (c[i]==3)
                {
                    l+=(50-a[i-1])*flag[i];
                }
                else if (c[i]==4)
                {
                    r+=(50-a[i-1])*flag[i];
                }
            }
        }
        x=r-l;
        y=u-d;
        if(x<0) x=0;//判断坐标是否越界
        if(y<0) y=0;
        if(x>50) x=50;
        if(y>50) y=50;
        printf("%d %d\n",x,y);
    }
    return 0;
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值