浙江财经大学
信息管理与工程学院

POJ 1835 宇航员

本文由 Ocrosoft 于 2016-08-25 20:45:09 发表

Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%lld & %llu

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

Solution

思路:三维空间要用三个变量去记录方位,分别是面向的方向,左边(或右边)的方向,上面(或下面)的方向。
然后转向的时候,向左转之后,面朝原来的左边,新的左边是原来面朝方向的反方向,上面不变。其他方向依次类推。
反方向表示可以写个数组,也可以(x+3)%6。
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <ctime>
#include <string>
#include <cstdio>
#include <vector>
#include <cctype>
#include <climits>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <functional>
#define ms(a) memset(a,0,sizeof(a))
typedef long long ll;
const int INF = INT_MAX / 2;
const int MAXN = 10000 + 10;
using namespace std;
int n, m;
int x, y, z;
int bd(int p)//计算负方向
{
	return (p + 3) % 6;
}
void go(int p, int step)
{
	if (p == 0)x += step;
	else if (p == 3)x -= step;
	else if (p == 1)y += step;
	else if (p == 4)y -= step;
	else if (p == 2)z += step;
	else if (p == 5)z -= step;
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n;
		cin >> n;
		x = y = z = 0;
		int forw = 0, left = 4, up = 2;//前、左、上
		while (n--)
		{
			int step, t;
			char s[MAXN];
			scanf("%s%d", s, &step);
			switch (s[0])
			{
			case 'f':
				break;
			case 'b':
				forw = bd(forw);
				left = bd(left);
				break;
			case 'l':
				t = forw;
				forw = left;
				left = bd(t);
				break;
			case 'r':
				t = forw;
				forw = bd(left);
				left = t;
				break;
			case 'u':
				t = forw;
				forw = up;
				up = bd(t);
				break;
			case 'd':
				t = forw;
				forw = bd(up);
				up = t;
				break;
			default:
				break;
			}
			go(forw, step);
		}
		printf("%d %d %d %d\n", x, y, z, forw);
	}
	return 0;
}

欢迎分享与转载,请保留链接与出处。Ocrosoft » POJ 1835 宇航员

点赞 (0)or拍砖 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址