[OpenJudge] 宇航员(模拟)

03:宇航员

传送门

描述
问题描述:
  宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟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米。
其中向上和向下如下图所示:

输入
第一行一个正整数m,表示测试数据的组数。每组测试数据第一行是一个正整数n(1<=n<=10000)表示宇航员行走的次数,下面n行每行输入一次相对行走,格式如上所述,其中( 1 <= x <= 10000 为正整数)。
输出
对于每组输入数据输出一行,x y z p, 中间用空格隔开,x y z是宇航员的位置的绝对坐标,p是宇航员面向的绝对方向编号(0<=p <=5)。
样例输入
1
6
left 10
right 11
up 12
down 13
forward 14
back 15
样例输出
23 -10 12 3

题解

刚开始看到这道题时感觉简单,只需要6个方向再进行计算就行了。但是做的过程中发现情况没想象中的那么简单:同样是朝右的情况下,头朝上右转和头朝前右转是不一样的,于是想了一个量q来表示上方向。如当面朝右边,即p=0时,只需要看一种情况,如q=2时,左转后p变为4,即p变为q顺时针所对应的下一位。此种做法只有左转右转需要列出情况,其他还算简单。

#include<iostream>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--){
        int n,p=0,q=2,x=0,y=0,z=0;
        cin >> n;
        for(int i=1;i<=n;i++){
            string s;
            int d;
            cin >> s >> d;
            if(s=="left"){
                if(p==0){
                    if(q==1){
                        p=2;
                    }
                    if(q==2){
                        p=4;
                    }
                    if(q==4){
                        p=5;
                    }
                    if(q==5){
                        p=1;
                    }
                }
                else if(p==1){
                    if(q==0){
                        p=5;
                    }
                    if(q==2){
                        p=0;
                    }
                    if(q==3){
                        p=2;
                    }
                    if(q==5){
                        p=3;
                    }
                }
                else if(p==2){
                    if(q==0){
                        p=1;
                    }
                    if(q==1){
                        p=3;
                    }
                    if(q==3){
                        p=4;
                    }
                    if(q==4){
                        p=0;
                    }
                }
                else if(p==3){
                    if(q==1){
                        p=5;
                    }
                    if(q==2){
                        p=1;
                    }
                    if(q==4){
                        p=2;
                    }
                    if(q==5){
                        p=4;
                    }
                }
                else if(p==4){
                    if(q==0){
                        p=2;
                    }
                    if(q==2){
                        p=3;
                    }
                    if(q==3){
                        p=5;
                    }
                    if(q==5){
                        p=0;
                    }
                }
                else if(p==5){
                    if(q==0){
                        p=4;
                    }
                    if(q==1){
                        p=0;
                    }
                    if(q==3){
                        p=1;
                    }
                    if(q==4){
                        p=3;
                    }
                }
            }
            else if(s=="right"){
                if(p==0){
                    if(q==1){
                        p=5;
                    }
                    if(q==2){
                        p=1;
                    }
                    if(q==4){
                        p=2;
                    }
                    if(q==5){
                        p=4;
                    }
                }
                else if(p==1){
                    if(q==0){
                        p=2;
                    }
                    if(q==2){
                        p=3;
                    }
                    if(q==3){
                        p=5;
                    }
                    if(q==5){
                        p=0;
                    }
                }
                else if(p==2){
                    if(q==0){
                        p=4;
                    }
                    if(q==1){
                        p=0;
                    }
                    if(q==3){
                        p=1;
                    }
                    if(q==4){
                        p=3;
                    }
                }
                else if(p==3){
                    if(q==1){
                        p=2;
                    }
                    if(q==2){
                        p=4;
                    }
                    if(q==4){
                        p=5;
                    }
                    if(q==5){
                        p=1;
                    }
                }
                else if(p==4){
                    if(q==0){
                        p=5;
                    }
                    if(q==2){
                        p=0;
                    }
                    if(q==3){
                        p=2;
                    }
                    if(q==5){
                        p=3;
                    }
                }
                else if(p==5){
                    if(q==0){
                        p=1;
                    }
                    if(q==1){
                        p=3;
                    }
                    if(q==3){
                        p=4;
                    }
                    if(q==4){
                        p=0;
                    }
                }
            }
            else if(s=="up"){
                int t=p;
                p=q;
                if(t==0||t==1||t==2){
                    q=t+3;
                }
                else q=t-3;
            }
            else if(s=="down"){
                int t=q;
                q=p;
                if(t==0||t==1||t==2){
                    p=t+3;
                }
                else p=t-3;
            }
            else if(s=="foward"){

            }
            else if(s=="back"){
                if(p==0||p==1||p==2){
                    p=p+3;
                }
                else p=p-3;
                }
                if(p==0){
                    x+=d;
                }
                if(p==1){
                    y+=d;
                }
                if(p==2){
                    z+=d;
                }
                if(p==3){
                    x-=d;
                }
                if(p==4){
                    y-=d;
                }
                if(p==5){
                    z-=d;
                }
                //cout << x << ‘ ‘ << y << ‘ ‘ << z << ‘ ‘ << p << ‘ ‘ << q << endl;
            }
            cout << x << ‘ ‘ << y << ‘ ‘ << z << ‘ ‘ << p << endl; 

         }

    return 0;
}


但是此种做法列举情况太多容易错误,且难以改正。

另外一种做法是用三个量表示三个不同的方位,此时操作只有取反和赋值。

同时给一个更好代替反转操作的式子

n=(n+3)%6

 
时间: 2024-12-27 23:36:04

[OpenJudge] 宇航员(模拟)的相关文章

POJ1835 宇航员 模拟

一道模拟题:http://poj.org/problem?id=1835 直接将宇航员当前方向.相对头顶方向.相对左边方向写出来即可. 代码如下: #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char s[10]; int t, step; scanf("%d", &t); while(t--) { int

模拟--poj1835宇航员的故事

这道题委实无语了,刚开始以为是很一般的方位模拟题,懒得看样例直接写的代码,然后敲了好几个switch结果样例居然没出来.. 仔细分析了样例之后才发现原来随着宇航员方位的改变他的左手方向以及头顶方向是跟着变的.. 然后就要时刻记录.. 方向感和想象力不行就只能在纸上画好久了 .. 无奈了.. Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Description 问题描述:  宇航员在太空中迷

【openjudge】【字符串+模拟】1777:文件结构“图”

[题目传送门:]戳 [描述:] 在计算机上看到文件系统的结构通常很有用.Microsoft Windows上面的"explorer"程序就是这样的一个例子.但是在有图形界面之前,没有图形化的表示方法的,那时候最好的方式是把目录和文件的结构显示成一个"图"的样子,而且使用缩排的形式来表示目录的结构.比如: ROOT | dir1 | file1 | file2 | file3 | dir2 | dir3 | file1 file1 file2 这个图说明:ROOT目录

[OpenJudge] 摘花生 (模拟)

2950:摘花生 传送门 描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:"欢迎免费品尝我种的花生!--熊字".鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1).有经验的多多一眼就能看出,每棵花生植株下的花生有多少.为了训练多多的算术,鲁宾逊先生说:"你先找出花生最多的植株,去采摘它的花生:然后再找出剩下的植株里花生最多的,去采摘它的

[OpenJudge] 显示器(模拟)

02:显示器 传送门 描述 你的一个朋友买了一台电脑.他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷.为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样. 输入 输入包括若干行,每行表示一个要显示的数.每行有两个整数s和n (1 <= s <= 10, 0 <= n <= 99999999),这里n是要显示的数,s是要显示的数的尺寸. 如果某行输入包括两个0,表示输入结束.这行不需要处理. 输出 显示的方式是:

poj 1835 宇航员

http://poj.org/problem?id=1835 宇航员 Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4802   Accepted: 2058 Description 问题描述:  宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟xyz坐标系,称为绝对坐标系,宇航员正面的方向为x轴正方向,头顶方向为z轴正方向,则宇航员的初始状态如下图所示: 现对六个方向分别标号,x,y,z正方向分别为0,1,2,

Poj OpenJudge 百练 1573 Robot Motion

1.Link: http://poj.org/problem?id=1573 http://bailian.openjudge.cn/practice/1573/ 2.Content: Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10856   Accepted: 5260 Description A robot has been programmed to follow the instru

Poj OpenJudge 百练 2632 Crashing Robots

1.Link: http://poj.org/problem?id=2632 http://bailian.openjudge.cn/practice/2632/ 2.Content: Crashing Robots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7912   Accepted: 3441 Description In a modernized warehouse, robots are used to

POJ 1835 大模拟

宇航员 #include<iostream> #include<cstdio> #include<string> #include<cstring> #define maxn 10010 using namespace std; int a[7],temp[7]; char str[10]; void solve(int str2[],int str3[]) { if(strcmp(str,"forward")==0)//方向不变 { s