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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值