本题思路:
采用变量f , l , u 表示forward、left、up三个方向,f 可以取值0,3,l 可以取值1,4,u 取值 2,5 。
当宇航员的绝对方向发生变化时,三个变量的变化规律如下所示
forward | left | up | |
forward | 不变 | 不变 | 不变 |
back | - forward | - left | 不变 |
left | left | - forward | 不变 |
right | - left | forward | 不变 |
up | up | 不变 | - forward |
down | - up | 不变 | forward |
AC代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int rev(int a)
{
if( a == 0 ) return 3;
if( a == 1 ) return 4;
if( a == 2 ) return 5;
if( a == 3 ) return 0;
if( a == 4 ) return 1;
if( a == 5 ) return 2;
}
int main(int argc, char *argv[])
{
int m, n;
int x, y, z, dis;
int f, l, u, tmp;//表示forward、left、up
char dir[10];
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
x = y = z = 0;
f = 0 ;
l = 4 ;
u = 2 ;
while(n--)
{
scanf("%s %d",dir,&dis);
switch(dir[0])
{
case 'f':
break;
case 'b':
f = rev(f) ;
l = rev(l) ;
break;
case 'l':
tmp = f ;
f = l;
l = rev(tmp) ;
break;
case 'r':
tmp = f;
f = rev(l);
l = tmp;
break;
case 'u':
tmp = f ;
f = u;
u = rev(tmp) ;
break;
case 'd':
tmp = f ;
f = rev(u);
u = tmp;
break;
}
switch(f)
{
case 0: x += dis; break;
case 1: y += dis; break;
case 2: z += dis; break;
case 3: x -= dis; break;
case 4: y -= dis; break;
case 5: z -= dis; break;
}
}
printf("%d %d %d %d\n",x,y,z,f);
}
return 0;
}