机器人以(0,0)为起点,x轴正方向为为正方向。如图
每次都直走(forward),向左转(left),向后转(back),向右转(right),每次转向后都会走x个单位长度。题目:首先输入一个n,接下来n行内输入:指令“空格”x的大小(left 4),求经过一系列指后机器人的坐标位置。
首先确定方向
定义一个变量,这里定义face确定机器人朝向。
再输入一个数组确定机器人走的方向。(这里必须是顺时针或者逆时针),我这里使用的逆时针。
int dx[4] = { 1,0,-1,0 }; // 右上左下
int dy[4] = { 0,1,0,-1 };
首先dx[0] dy[0]两个共同使用就是向右走为x轴的正方向。那么我就可以将face的初始值定义成0来代表我的起始方向。如:dx[face] dy[face] 就等价于 dx[0] dy[0]吗,代表向右走。
判断机器人该怎么转向
每次都会给定转向指令的首字母都不同,就可以以首字母来区分。
每次都必须输入指令,就可以定义一个char数组,直接以字符串来输入进来。ps:后边的x是上边行走的距离。
char let[15];
for (int i = 0; i < n; i++) {
scanf("%s %d", &let, &x);
if (let[0] == 'f') {
face = (face + 0) % 4;
}
if (let[0] == 'l') {
face = (face + 1) % 4;
}
if (let[0] == 'b') {
face = (face + 2) % 4;
}
if (let[0] == 'r') {
face = (face + 3) % 4;
}
}
这里为什么要对4取模,因为有四个方向,dx和dy数组最多有4个方向,每次都要保证在这个范围之内。举例子:left face=(face + 1)% 4。face = 1,dx[face] dy[face] == dx[1] dy[1] == {0}{1}。y是正方向,x为0,就会向上走。
最后是怎样确定最终坐标。
直接定义两个0的变量
nowx += dx[face] * x;
nowy += dy[face] * x;
最终结果
int dx[4] = { 1,0,-1,0 }; // 右上左下
int dy[4] = { 0,1,0,-1 };
char let[15];
int main() {
int nowx, nowy, face, n, x;
nowx = 0;
nowy = 0;
face = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s %d", &let, &x);
if (let[0] == 'f') {
face = (face + 0) % 4;
}
if (let[0] == 'l') {
face = (face + 1) % 4;
}
if (let[0] == 'b') {
face = (face + 2) % 4;
}
if (let[0] == 'r') {
face = (face + 3) % 4;
}
nowx += dx[face] * x;
nowy += dy[face] * x;
}
printf("%d %d", nowx, nowy);
return 0;
}
测试样例:back -9
left 3
left 8
back 15
right 10
right -7
right -3
left 11
right 17
left 3