1. 程式人生 > >宇航員

宇航員

問題描述:
  宇航員在太空中迷失了方向,在他的起始位置現在建立一個虛擬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

解題思路:模擬題,每次當我們對宇航員進行操作的時候記下現在宇航員的上下左右前後的方向,

方便下一次的操作,再分別開一個x,y,z記錄當前座標即可

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int g;
		scanf("%d",&g);
		int l = 4, r = 1, u = 2, d = 5, t = 0, b = 3;//記錄當前狀態下的六個方向 
		long long int steps=0,x=0,y=0,z=0;
		for(int i = 0; i < g; i++)
		{
			char s[25] = {0};
			int steps;
			scanf("%s %d",s,&steps);
			if(s[0] == 'l')  //記錄改變方向後的六個方向 
			{
				int v = t;
				t = l;
				r = v;
				l = b;
				if(t <= 2)
				b = t + 3;
				else
				b = t - 3;
			}
			else if(s[0] == 'r')
			{
				int v = t;
				t = r;
				r = b;
				l = v;
				if(t <= 2)
				b = t + 3;
				else
				b = t - 3;
			}
			else if(s[0] == 'u')
			{
				int v = t;
				d = v;
				t = u;
				u = b;
				if(t <= 2)
				b = t + 3;
				else
				b = t - 3;
			}
			else if(s[0] == 'b')
			{
				int v = t;
				t = b;
				b = v;
				v = r;
				r = l;
				l = v;
			}
			else if(s[0] == 'd')
			{
				int v = t;
				t = d;
				u = v;
				d = b;
				if(t <= 2)
				b = t + 3;
				else
				b = t - 3;
			}
			if(t == 0)
				x = x + steps;
			if(t == 1)
				y = y + steps;
			if(t == 2)
				z = z + steps;
			if(t == 3)
				x = x - steps;
			if(t == 4)
				y = y - steps;
			if(t == 5)
				z = z - steps;
		}
		printf("%lld %lld %lld %d\n", x, y, z, t);
	}
}