模拟题 宇航员(poj1835)

题目连接:http://poj.org/problem?id=1835

这是一道模拟题,对于模拟题的话我一直觉得自己思路不是特别清楚,其次的话就是写if else的时候容易写错(主要原因是不喜欢用括号括起来),然后代码一般会比较长,对,就是这样!

这道题目的关键在于怎么去实现改变方向,注意是相对方向,既然是相对方向的话,我们就应该以人来看,找到参照物,很显然的话脸所朝的方向就是正方向然后就可以改变方向了,但是变化后我们又需要记录此时脸的朝向,然而仅仅记录一个又是不够的因为头是朝那个方向也不确定,左右手也是一样,因此有三个需要记录的,然后我们再去推理是如何变化的比如说:

向左走,那么现在的face的朝向和左手之前一样,而左手则是face之前的反方向即lefthead=(之前的face+3)%6,头的朝向则是不会变化的;

同理我们可以得出向其他方向走的规律,就不一个个展示了,直接贴代码;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int Max = 0x3f3f3f3f;
const int Min = 0xc0c0c0c0;
const int maxn = 123456;
#define mst(a) memset(a,0,sizeof(a))
#define w(i) while(i--)
#define forij(i,j,k,step) for(int i=k;i<j;i+=step)
int t,n,m;
int main()
{
    int zuo,face,head,num;
    int x,y,z;
    string s;
    cin>>m;
    while(m--)
    {
        x=y=z=0;
        zuo=4,face=0,head=2;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>s>>num;
            if(s[0]=='l')
            {
                t=face;
                face=zuo;
                zuo=(t+3)%6;
            }
            else if(s[0]=='r')
            {
                t=zuo;
                zuo=face;
                face=(t+3)%6;

            }
            else if(s[0]=='u')
            {
                t=face;
                face=head;
                head=(t+3)%6;
            }
            else if(s[0]=='d')
            {
                t=head;
                head=face;
                face=(t+3)%6;

            }
            else if(s[0]=='b')
            {
                face=(face+3)%6;
                zuo=(zuo+3)%6;
            }
            if(face==0)
            {
                x+=num;
            }
            else if(face==1)
            {
                y+=num;
            }
           else if(face==2)
            {
                z+=num;
            }
            else if(face==3)
            {
                x-=num;
            }
            else if(face==4)
            {
                y-=num;
            }
            else if(face==5)
            {
                z-=num;
            }
            //cout<<face<<endl;
        }
        cout<<x<<' '<<y<<' '<<z<<' '<<face<<endl;
    }
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值