ZCMU1901-LOGO

题目链接:LOGO

题目:

Problem E: Logo

Logo is a programming language built around a turtle. Commands in the language cause the turtle to move. The turtle has a pen attached to it. As the turtle moves, it draw lines on the page. The turtle can be programmed to draw interesting pictures.

We are interested in making the turtle draw a picture, then return to the point that it started from. For example, we could give the turtle the following program:

fd 100 lt 120 fd 100 lt 120 fd 100

The command fd causes the turtle to move forward by the specified number of units. The command lt causes the turtle to turn left by the specified number of degrees. Thus the above commands cause the turtle to draw an equilateral triangle with sides 100 units long. Notice that after executing the commands, the turtle ends up in the same place as it started. The turtle understands two additional commands. The command bk causes the turtle to move backward by the specified number of units. The command rt causes the turtle to turn right by the specified number of degrees.

After executing many commands, the turtle can get lost, far away from its starting position. Your task is to determine the straight-line distance from the turtle's position at the end of its journey back to the position that it started from.

Input

The first line of input contains one integer specifying the number of test cases to follow. Each test case starts with a line containing one integer, the number of commands to follow. The commands follow, one on each line. Each test case will contain no more than 1000 commands.

Output

For each test case, output a line containing a single integer, the distance rounded to the nearest unit.

Sample Input

1
5
fd 100
lt 120
fd 100
lt 120
fd 100

Sample Output

0

题意:有四种操作,fd,bk,lt,rt.分别代表向前走,向后走,左转和右转,每个操作后面跟一个数字,fd,bk后面跟的是走的距离,lt,rt后面跟的是转的角度。一个人经过若干步骤移动后后,问他最后离起点有多远。
假设起点为(0,0),用一个角度变量来保存他的移动方向,根据位移方向角和位移距离算坐标的话画画图就看得出来了,就是一个直角三角形里面已知一角和一斜边求另外两边的事。求得最后终点坐标后就直接两点之间距离公式。

代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#define inf 0x3f3f3f3f
#define PI acos(-1.0)
using namespace std;

double x,y,ang;

void go(int l)
{
    x=x+sin(PI*ang/180)*l;
    y=y+cos(PI*ang/180)*l;
}

void turn(int a)//这里注意时刻更新角度
{
    ang+=a;
    while(ang>360)
        ang-=360;
    while(ang<0)
        ang+=360;
}

int main()
{
    int t,n,k;
    string s;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        x=y=ang=0;
        for(int i=0;i<n;i++)
        {
            cin>>s;
            scanf("%d",&k);
            if(s=="fd")
                go(k);
            else if(s=="bk")
                go(-k);
            else if(s=="lt")
                turn(k);
            else if(s=="rt")
                turn(-k);
        }
        printf("%.0lf\n",sqrt(x*x+y*y));//(x,y)到(0,0)的距离
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值