题目描述
假设在一个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分别代表 正向上、正向右、正向下、正向左的方向 (与数组的下标对应)。
用一个 head 值记录 当前机器人正对的方向。(默认为0——正上方) ,然后通过模运算,完成左转、右转、掉头等操作。(详情请对比代码)
最后机器人要前进的时候,直接根据它所正对的方向,结合数组代值计算即可。
AC代码:
#include <stdio.h>
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;
}