POJ 1835 宇航员
来源:互联网 发布:人工智能权威期刊 编辑:程序博客网 时间:2024/05/01 23:28
原题 http://poj.org/problem?id=1835
题目:
宇航员
Time Limit: 2000MS Memory Limit: 30000K
Total Submissions: 5187 Accepted: 2196
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
思路:
相比普通的平面移动,本题的空间立体移动的难点在于方向的改变,平面移动有4种方向,但是立体移动有6*4种方向(面朝的方向有6种,每面有4种不同的上方),枚举所有情况上万行代码也是可以过的,但是我们可以找到规律,就是每次变换的其实是一种旋转,比如向右走,是前后左右做一个90度的变换,向上走是做一个上下前后90度的变换,总共有6种改变方向的情况,我们只需要用6个函数即可。
当前状态f拥有6个方向,分别按题意初始化成对应方向。即坐标轴方向,每次改变方向后我们都能知道面向的是哪个方向,对应的方向在坐标系种进行相应的距离移动即可。
代码:
#include <iostream>#include"string.h"#include"cstdio"#include"stdlib.h"#include"algorithm"using namespace std;typedef long long int lint;typedef struct{ int qian; int hou; int zuo; int you; int shang; int xia;}flag;flag f;char s1[10]="left";char s2[10]="right";char s3[10]="forward";char s4[10]="back";char s5[10]="up";char s6[10]="down";void left(){ int tem=f.qian; f.qian=f.zuo; f.zuo=f.hou; f.hou=f.you; f.you=tem;}void right(){ int tem=f.qian; f.qian=f.you; f.you=f.hou; f.hou=f.zuo; f.zuo=tem;}void forward(){}void back(){ swap(f.qian,f.hou); swap(f.zuo,f.you);}void up(){ int tem=f.qian; f.qian=f.shang; f.shang=f.hou; f.hou=f.xia; f.xia=tem;}void down(){ int tem=f.qian; f.qian=f.xia; f.xia=f.hou; f.hou=f.shang; f.shang=tem;}int main(){ int n; cin>>n; while(n--) { int x=0,y=0,z=0; int t; f.qian=0; f.hou=3; f.you=1; f.zuo=4; f.shang=2; f.xia=5; cin>>t; while(t--) { char s[10]; int num; scanf("%s %d",&s,&num); if(!strcmp(s,s1)) left(); if(!strcmp(s,s2)) right(); if(!strcmp(s,s3)) forward(); if(!strcmp(s,s4)) back(); if(!strcmp(s,s5)) up(); if(!strcmp(s,s6)) down(); if(f.qian==0) x=x+num; if(f.qian==3) x=x-num; if(f.qian==1) y=y+num; if(f.qian==4) y=y-num; if(f.qian==2) z=z+num; if(f.qian==5) z=z-num; } printf("%d %d %d %d\n",x,y,z,f.qian); } return 0;}
- poj 1835 宇航员
- poj 1835 宇航员
- POJ 1835 宇航员
- poj 1835 宇航员
- POJ 1835 宇航员
- POJ 1835 宇航员
- POJ 1835宇航员
- POJ 1835 宇航员 中文
- poj-1835-宇航员
- 宇航员 POJ 1835
- poj 1835 宇航员
- POJ 1835 宇航员 (模拟&三维向量旋转)
- POJ 1835 : 宇航员 - 模拟,三维向量旋转
- 1835 宇航员
- 宇航员
- 宇航员
- 百练OJ:1835:宇航员
- 第6章练习题--1--宇航员--1835
- Ubuntu常用工具
- c++中string类的用法详解
- Path特效之PathMeasure打造万能路径动效
- GridView+SimpleAdapter的简单使用
- 关于UIImageView 添加UITapGestureRecognizer后传参的问题
- POJ 1835 宇航员
- [LeetCode]Letter Combinations of a Phone Number
- Codeforces Round #283 (Div. 2) B. Secret Combination 构造+枚举
- C++ 无名对象
- 经典SQL语句大全
- UIImage
- 微信公众平台开发教程新手解惑40则
- Java关键字this、super使用总结
- python学习笔记——异常处理