Bailian1835 POJ1835 宇航员模拟

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian1835 POJ1835 宇航员模拟相关的知识,希望对你有一定的参考价值。

宇航员
Time Limit: 2000MS Memory Limit: 30000K
Total Submissions: 8900 Accepted: 3629

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

Source

qinlu@POJ

问题链接Bailian1835 POJ1835 宇航员
问题简述:(略)
问题分析:模拟问题,不解释。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* Bailian1835 POJ1835 宇航员 */

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const char *dir[] = {"forward", "back", "left", "right", "up", "down"};
char d[10];

int main()
{
    int m, n, mov;
    scanf("%d", &m);
    while (m--) {
        scanf("%d", &n);

        int f = 0, fr = 1, h = 2, x = 0, y = 0, z = 0;
        while (n--) {
            scanf("%s%d", d, &mov);

            if (strcmp(d, dir[1]) == 0)     // back
                f = (f + 3) % 6, fr = (fr + 3) % 6;
            else if (strcmp(d, dir[2]) == 0) {        // left
                int tmp = f;
                f = (fr + 3) % 6;
                fr = tmp;
            } else if (strcmp(d, dir[3]) == 0) {        // right
                int tmp = f;
                f = fr;
                fr = (tmp + 3) % 6;
            } else if (strcmp(d, dir[4]) == 0) {        // up
                int tmp = f;
                f = h;
                h = (tmp + 3) % 6;
            } else if (strcmp(d, dir[5]) == 0) {        // down
                int tmp = f;
                f = (h + 3) % 6;
                h = tmp;
            }

            if (f == 0) x += mov;
            else if (f == 1) y += mov;
            else if (f == 2) z += mov;
            else if (f == 3) x -= mov;
            else if (f == 4) y -= mov;
            else z -= mov;
        }

        printf("%d %d %d %d\\n", x, y, z, f);
    }

    return 0;
}

以上是关于Bailian1835 POJ1835 宇航员模拟的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1835宇航员

一般错误:1835 格式错误的通信数据包 [重复]

1835 魔法猪学院

1835:04NOIP提高组津津的储蓄计划

bzoj1835 [ZJOI2010]基站选址

P1835 素数密度(区间筛)