POJ1835 宇航员

        这是一道三维空间的模拟题,解题的关键在于如何确定宇航员当前所处的方向状态。通过题目,用心点我们不难发现其方向改变有一定的规律可循。

        x、y、z轴的正半轴方向可以用0 1 2来表示。

       x、y、z轴的负半轴方向可用3 4 5 来表示。

       最好自己能在草稿纸画一下,这样下面的推理便一目了然了!

        在这里我们大可只用三个变量便可确定当前宇航员的状态:p  left    top  用来表示宇航员的面朝方向、左边方向以及顶部方向。所有方向形成了一个环状,前与后、左与右、上与下的关系可表示如下(如若还是不理解,大可自己模拟一下):(p+3)%6   (left+3)%6   (top+3)%6.

当然其他方向也要随之改变。xx、yy、zz分别对应各轴,定义一个  move(step) 函数,对应方向累加输入的步数,最后输出xx,yy,zz的值即可!

宇航员
Time Limit: 2000MS Memory Limit: 30000K
Total Submissions: 5190 Accepted: 2198

Description

问题描述: 
  宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟xyz坐标系,称为绝对坐标系,宇航员正面的方向为x轴正方向,头顶方向为z轴正方向,则宇航员的初始状态如下图所示: 

现对六个方向分别标号,x,y,z正方向分别为0,1,2,负方向分别为3,4,5;称它们为绝对方向。宇航员在宇宙中只沿着与绝对坐标系xyz轴平行的方向行走,但是他不知道自己当前绝对坐标和自己面向的绝对方向。 

任务描述: 
  请根据宇航员对自己在相对方向上移动的描述确定宇航员最终的绝对坐标和面向的绝对方向。对在相对方向上移动的描述及意义如下: 
forward x  向前走x米。 
back x 先转向后,再走x米。 
left x 先转向左,再走x米。 
right x 先转向右,再走x米。 
up x 先面向上,再走x米。 
down x 先面向下,再走x米。 
其中向上和向下如下图所示: 

Input

第一行一个正整数m,表示测试数据的组数。每组测试数据第一行是一个正整数n(1<=n<=10000)表示宇航员行走的次数,下面n行每行输入一次相对行走,格式如上所述,其中( 1 <= x <= 10000 为正整数)。

Output

对于每组输入数据输出一行,x y z p, 中间用空格隔开,x y z是宇航员的位置的绝对坐标,p是宇航员面向的绝对方向编号(0<=p <=5)。

Sample Input

1
6
left 10
right 11
up 12
down 13
forward 14
back 15

Sample Output

23 -10 12 3
#include<iostream>
#include<string>
using namespace std;
int p,xx,yy,zz;
void multi(int x){
	switch(p){
		case 0:{
			xx+=x;
			break;
		}
		case 1:{
			yy+=x;
			break;
		}
		case 2:{
			zz+=x;
			break;
		}
		case 3:{
			xx+=-x;
			break;
		}
		case 4:{
			yy+=-x;
			break;
		}
		case 5:{
			zz+=-x;
			break;
		}
	}
}
int main(){
	int t,step,up,left,n,m;
	string move;
	cin>>n;
	while(n--){
		xx=yy=zz=0;
		p=0,up=2,left=4;
		cin>>m;
		while(m--){
			cin>>move>>step;
			if(move=="forward") {//向前走不用改变任何方向,面朝的方向轴加上对应的值就好 
				multi(step);
			}
			else if(move=="back") { //如果是向后转,改变其面朝方向与左边方向 
				p=(p+3)%6;
				left=(left+3)%6;
				multi(step);
			}
			else if(move=="left"){  //左转改变其左转方向并且左边方向对应改变 
				t=p;
				p=left;
				left=(t+3)%6;
				multi(step);
			}
			else if(move=="right"){//右转与左转大同小异,原来的面朝方向变为左边方向 
				t=p;
				p=(left+3)%6;
				left=t;
				multi(step);
			}
			else if(move=="up"){//改变其上下方向 
				t=p;
				p=up;
				up=(t+3)%6;
				multi(step);
			}
			else if(move=="down"){
				t=p;
				p=(up+3)%6;
				up=t;
				multi(step);
			}
		}
	cout<<xx<<" "<<yy<<" "<<zz<<" "<<p<<endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值