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;}
0 0
原创粉丝点击