POJ 1835 : 宇航員 - 模擬,三維向量旋轉

(OJ 寒假馬拉松 第五場 E題)


從別人博客看到較精煉的解法


思路:

用一個三維向量記錄人的身體朝向的信息——面朝的方向,身體豎直方向向上的方向,人左臂平伸的方向。

6種變換就是對這個向量的操作。(詳見代碼)

注意:題目是左手座標系


另外可以參考這裏,方法相同。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	char s[10];
	int t,n,x,y,z,fwd,left,tmp,dis,v;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		x=y=z=fwd=0;
		left=4;v=2;
		while(n--){
			scanf("%s %d",s,&dis);
			if(s[0]=='b'){
				fwd=(fwd+3)%6;
				left=(left+3)%6;
			}
			else if(s[0]=='l'){
				tmp=fwd;
				fwd=left;
				left=(tmp+3)%6;
			}
			else if(s[0]=='r'){
				tmp=left;
				left=fwd;
				fwd=(tmp+3)%6;
			}
			else if(s[0]=='u'){
				tmp=fwd;
				fwd=v;
				v=(tmp+3)%6;
			}
			else if(s[0]=='d'){
				tmp=v;
				v=fwd;
				fwd=(tmp+3)%6;
			}
			if(fwd==0) x+=dis;
			else if(fwd==1) y+=dis;
			else if(fwd==2) z+=dis;
			else if(fwd==3) x-=dis;
			else if(fwd==4) y-=dis;
			else z-=dis;
		}
		printf("%d %d %d %d\n",x,y,z,fwd);
	}
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章