XTU-OJ 1227-Robot

题目描述

假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为

  • LEFT:向左转
  • RIGHT:向右转
  • BACK:向后转
  • FORWORD n:向前走n(1≤n≤100)个单位

现在给你一个指令序列,求机器人最终的位置。

输入

样例的第一行是一个整数T(T≤20),表示样例的个数。 每个样例的第一行是一个整数N(1≤N≤1,000),表示指令的条数。 以后的N行,每行一条指令。

输出

每个样例输出两个整数,为坐标(x,y),之间用空格隔开。

样例输入
2
4
LEFT
FORWORD 1
RIGHT
FORWORD 1
2
BACK
FORWORD 1

样例输出
-1 1
0 -1

解题思路: 用一个二维数组,储存(x,y) 坐标在每个方向(y轴正方向, x轴正方向,y轴负方向,x轴负方向) 的运算代值。

然后利用 0,1,2,3分别代表 正向上、正向右、正向下、正向左的方向 (与数组的下标对应)。

XTU-OJ 1227-Robot_第1张图片

用一个 head 值记录 当前机器人正对的方向。(默认为0——正上方) ,然后通过模运算,完成左转、右转、掉头等操作。(详情请对比代码)

最后机器人要前进的时候,直接根据它所正对的方向,结合数组代值计算即可。

AC代码:

#include 

int x,y,head;
int goal[5][2] = {{0,1},{1,0},{0,-1},{-1,0}};      // 上、右、下、左
char operate[10];

int main()
{
    int T,N,n;
    scanf("%d",&T);
    while ( T --)
    {
        x = y = 0;
        head = 0;
        scanf("%d",&N);
        for (int i = 0; i < N; i ++)
        {
            scanf("%s",operate);
            if (operate[0] == 'L')         //  +3 %4,可实现左转操作
                head = (head+3)%4;
            else if (operate[0] == 'R')    //  +1 %4,可实现右转操作
                head = (head+1)%4;
            else if (operate[0] == 'B')    //  +2 %4,可实现掉头操作
                head = (head+2)%4;
            else if (operate[0] == 'F')
            {
                scanf("%d",&n);
                x = x + n*goal[head][0];
                y = y + n*goal[head][1];
            }
        }
        printf("%d %d\n",x,y);
    }
    return 0;
}

你可能感兴趣的:(湘大OJ练习解析,算法)