poj 1835 宇航员

注意 当宇航员面相z轴时,如果向上是头所对的方向,例如,如果宇航员现在面相z轴的正半轴(2)向上,则是x 的负半轴(3);如果打表的话要注意,宇航员的头可能会倒过来

有一个公式 坐标轴的方向 0,1,2,3,4,5,; 可得到(n+3)%6 即为 n 的反方向,只需设三个参数,dir,(脸所对方向) lfdir(左脸说对方想),h(头所对方向)

一开始 dir=0,h=2 lfdir=4

注意: 向左,向右,向前,向后,头的方向不变,向上,向下,左脸的方向不变

#include <iostream>
#include <string.h>
using namespace std;
char a[10];
int dir,dis;
int x,y,z;
void solve(int dir,int dis)
{
 if(dir==0)
  x+=dis;
 else if(dir==3) x-=dis;
 else if(dir==1) y+=dis;
 else if(dir==4) y-=dis;
 else if(dir==2) z+=dis;
 else z-=dis;
}
int main()                                                                                                                                                                                                                                                                                                            
{
 int i,t,n,h,lf,tem;
 cin>>t;
 while(t--)
 {
  cin>>n;
  dir=0;
  h=2;
  lf=4;
  x=0;
  y=0;
  z=0;
  for(i=0;i<n;i++)
  {
   cin>>a>>dis;
   switch(a[0])
   {
   case 'f': break;//向前走的时候脸,左脸,头的方向不变
   case 'b': //向后 脸,和左脸的方向与原来的方向相反 可以用公式
    dir=(dir+3)%6;
    lf=(lf+3)%6;
    break;
   case 'l': //向左转之后,脸的方向与原来左脸的方向相反,左脸的方向与原来脸的方向相同
    tem=dir;
    dir=lf;
    lf=(tem+3)%6;
    break;
   case 'r':
    tem=dir;
    dir=(lf+3)%6;
    lf=tem;
    break;
   case 'u'://向上的时候脸的方向与原来头的方向相同,头的方向与原来脸的方向相反
    tem=dir;
    dir=h;
    h=(tem+3)%6;
    break;
   case 'd':
    tem=dir;
    dir=(h+3)%6;
    h=tem;
    break;
   }
   solve(dir,dis);
  }              
  cout<<x<<" "<<y<<" "<<z<<" "<<dir<<endl;
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值