POJ 1835 宇航员

	题意是一个可以在三维空间任意行走的宇航员,告诉你他每次行走的方向,让求最后到达的地点和面对的方向。这题看上去比较简单,但仔细想想,其实就算是朝一个方向走也有4种不同的方式,所以很容易想到不仅记录前进的方向还要记录头所朝的方向,然后根据转弯判断之后的方向。
#include<stdio.h>
#include<string.h>
char tmp[20];
void next(int flag,int dir[],int head[])	//枚举所有的向左向右的情形
{
	if((dir[0]==head[1] && dir[0]) || (dir[1]+head[0]==0 && dir[1]))
	{
		dir[0]=0;
		dir[1]=0;
		dir[2]=flag;
	}
	else if((dir[0]+head[1]==0 && dir[0]) || (dir[1]==head[0] && dir[1]))
	{
		dir[0]=0;
		dir[1]=0;
		dir[2]=-flag;
	}
	else if((dir[1]==head[2] && dir[1]) || (dir[2]+head[1]==0 && dir[2]))
	{
		dir[0]=flag;
		dir[1]=0;
		dir[2]=0;
	}
	else if((dir[1]+head[2]==0 && dir[1]) || (dir[2]==head[1] && dir[2]))
	{
		dir[0]=-flag;
		dir[1]=0;
		dir[2]=0;
	}
	else if((dir[2]==head[0] && dir[2]) || (dir[0]+head[2]==0 && dir[0]))
	{
		dir[0]=0;
		dir[1]=flag;
		dir[2]=0;
	}
	else if((dir[2]+head[0]==0 && dir[2]) || (dir[0]==head[2] && dir[0]))
	{
		dir[0]=0;
		dir[1]=-flag;
		dir[2]=0;
	}
}
int main()
{
	int n,t,step,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		int dir[3]={1,0,0};			//前进的方向
		int head[3]={0,0,1};			//头朝的方向
		int site[3]={0,0,0};			//当前的位置
		while(n--)
		{
			scanf("%s %d",tmp,&step);
			if(strcmp(tmp,"left")==0)
				next(1,dir,head);
			if(strcmp(tmp,"right")==0)
				next(-1,dir,head);
			if(strcmp(tmp,"back")==0)	//向后就是将方向调转
				for(i=0;i<3;i++)
					dir[i]=-dir[i];
			if(strcmp(tmp,"up")==0)		//向上就是面向之前头朝的方向,头朝之前面向的反方向
			{
				int x[3];
				for(i=0;i<3;i++)
					x[i]=head[i];
				for(i=0;i<3;i++)
					head[i]=-dir[i];
				for(i=0;i<3;i++)
					dir[i]=x[i];
			}
			if(strcmp(tmp,"down")==0)	//向下就是面向之前头朝的反方向,头朝之前面向的方向
			{
				int x[3];
				for(i=0;i<3;i++)
					x[i]=head[i];
				for(i=0;i<3;i++)
					head[i]=dir[i];
				for(i=0;i<3;i++)
					dir[i]=-x[i];
			}
			for(i=0;i<3;i++)
				site[i]+=step*dir[i];
		}
		printf("%d %d %d ",site[0],site[1],site[2]);
		if(dir[0]>0)		//最后面朝的方向
			printf("0\n");
		if(dir[1]>0)
			printf("1\n");
		if(dir[2]>0)
			printf("2\n");
		if(dir[0]<0)
			printf("3\n");
		if(dir[1]<0)
			printf("4\n");
		if(dir[2]<0)
			printf("5\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值