题目连接: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;
}