POJ 1835宇航员

宇航员
Time Limit: 2000MS Memory Limit: 30000K
Total Submissions: 6882 Accepted: 2932
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
题目源地址:http://poj.org/problem?id=1835
题目大意:宇航员在太Jon各种可以上下左右前后六个方向移动,当他移动时,面部朝向也随之改变。他听从指令,改变自己的相对方向和距离,最终输出他的绝对方向。输入m组测试数据组数,宇航员的行走次数n,每次行走包括方向和距离,输出绝对坐标,以及面向方向forward.
解题思路:怎样才能知道每次转向后他的forward应该怎样变,其实不难发现六个方向中只有三个方向是有用的左或右,上或下,前或后,应为知道其中的一个就知道他的反方向是那个,这个可以从题目中推出来,每个绝对方向的反方向为(x+3)%6 ,所以说到这里应该就知道怎么做了,用六个变量记录,坐标(x,y,z)和三个方向forward,left,up。然后就不难推出转向后三个方向怎么变化,不管绝对坐标在哪里,每次绝对方向的变化只和转换的方向有关,我这里举个例子:比如向左转,up不变,forward变为原来的left,left变为原来(forward+3)%6即foward的反方向。(当然也可以打个表表示每个方向的反方向)。
forward(向前走):方向不变。
back(向后走):原来相对于宇航员的方向变为现在相对于宇航员的方向。
左变为右。右变为左。
前变为后。后变为前。
上下方向不变。
left(向左走):原来相对于宇航员的方向变为现在相对于宇航员的方向。
左变为前,右变为后。
前变为右,后变为左。
上下方向不变。
right(向右走):原来相对于宇航员的方向变为现在相对于宇航员的方向。
左变为后,右变为前。
前变为左,后变为右。
上下方向不变。
up(向上走):
左变为右,右变为左。
前变为上,后变为下。
上变为前,下变为后。
down(向下走):
左右方向不变。
前变为下,后变为上。
上变为后,下变为前。
代码如下:

#include <stdio.h>
#include <stdlib.h>
int xx,yy,zz;//存储宇航员绝对坐标
char action[100010];//宇航员行走的方向
void Go(int forward,int x)
{
    switch(forward)
    {
    case 0:
        xx+=x;
        break;
    case 3:
        xx-=x;
        break;
    case 1:
        yy+=x;
        break;
    case 4:
        yy-=x;
        break;
    case 2:
        zz+=x;
        break;
    default:
        zz-=x;
    }
}
int main()
{
    int m;
    scanf("%d",&m);//测试数据组数
    while(m--)
    {
        xx = yy = zz = 0;//绝对坐标,此时定义为0
        int n;
        scanf("%d",&n);//本次测试中,宇航员行走的次数
        int forward = 0;
        int left = 4;
        int  up =  2;
        int x;//某方向的行走步数
        int i;
        int t;
        for(i=0; i<n; i++)
        {
            getchar();
            scanf("%s%d",action,&x);
            switch(action[0])
                //方向left,right,up,down,forward,back第一个字母就不一样,所以比较第一个字符就可以
            {
            case 'f':
                break;
            case 'b':
                forward = (forward+3)%6;
                left = (left+3)%6;
                break;
            case 'l':
                t = forward;
                forward = left;
                left = (t+3)%6;
                break;
            case 'r':
                t = forward;
                forward = (left+3)%6;
                left = t;
                break;
            case 'u':
                t = forward;
                forward = up;
                up = (t+3)%6;
                break;
            case 'd':
                t = forward;
                forward = (up+3)%6;
                up = t;
                break;
                default:;
            }
            Go(forward,x);
        }
        printf("%d %d %d %d\n",xx,yy,zz,forward);
    }
    return 0;
}
阅读更多
个人分类: 蓝桥杯
上一篇2017第八届蓝桥杯C/C++ B组省赛题解
下一篇Android入门(一)AndroidStudio下的APP目录结构介绍
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭