宇航员在太空中可以上下左右前后六个方向移动
当他移动时面部朝向也随之改变
他听从指令,改变自己的相对方向和距离
最终输出他的绝对方向。
输入m测试数据组数,n行走次数,每步包含方向和距离
输出绝对坐标,以及面向方向p
http://poj.org/problem?id=1835
①三维坐标方向需要由三个变量控制是本题的关键
②然后发现x,y,z正方向分别为0,1,2,负方向分别为3,4,5
正方向与负方向正好差3,所以用到p=(p+3)%6等等
1 #include <stdio.h> 2 char action[10005]; 3 int xx,yy,zz; 4 void gogogo(int p,int x) //向某个方向p走x步 5 { 6 switch(p) 7 { 8 case 0: xx+=x;break; 9 case 3: xx-=x;break; 10 case 1:yy+=x;break; 11 case 4:yy-=x;break; 12 case 2:zz+=x;break; 13 default:zz-=x; 14 } 15 } 16 17 int main() 18 { 19 int m; 20 scanf("%d",&m); 21 while(m--) 22 { 23 xx=yy=zz=0; //xx,yy,zz是绝对坐标,此时定义为0 24 int n, x, p=0,left=4,t,head=2; 25 //用宇航员自身的p前,left左,head上三个方向确定绝对方向 26 scanf("%d",&n); 27 for(int i=0;i<n;i++) 28 { 29 getchar(); 30 scanf("%s%d",action,&x); 31 switch(action[0]) 32 //由于方向left right up down forward back第一个就不同,此处比较第一个字母就可以了 33 { 34 case 'f': break; 35 //向前都不变 36 case 'b': p=(p+3)%6,left=(left+3)%6;break; 37 //p和l改变 38 case 'l': t=p,p=left,left=(t+3)%6;break; 39 case 'r':t=p,p=(left+3)%6,left=t;break; 40 case 'u':t=p,p=head,head=(t+3)%6;break; 41 case 'd':t=p,p=(head+3)%6,head=t;break; 42 default: ; 43 } 44 gogogo(p,x); 45 //最终p方向确定了,向p走x步 46 } 47 printf("%d %d %d %d\n",xx,yy,zz,p); 48 } 49 return 0; 50 }
第一次做三维空间方向的题,虽然不太适应。。。但是感觉挺基础。。也挺有意思。。