题目描述
一颗骰子放在桌面上,1点在顶面,6点在底面,5点在正面,2点在背面,3点在左面,4点在右面。 我们分别使用”UDLRXY”分别表示按左手螺旋法则,沿x,y,z轴顺时钟和逆时钟转动90度。 比如在初始状态下,各指令执行后各面的点数如表所示。
指令 | 顶面 | 底面 | 正面 | 背面 | 左面 | 右边 |
---|---|---|---|---|---|---|
U | 5 | 2 | 6 | 1 | 3 | 4 |
D | 2 | 5 | 1 | 6 | 3 | 4 |
L | 4 | 3 | 5 | 2 | 1 | 6 |
R | 3 | 4 | 5 | 2 | 6 | 1 |
X | 1 | 6 | 4 | 3 | 5 | 2 |
Y | 1 | 6 | 3 | 4 | 2 | 5 |
现在给你一个指令序列,请问从初始状态开始执行完这个指令序列后顶面的点数是多少?
输入
存在不超过1000条指令序列,每行一条指令序列,为一个只包含”UDLRXY”的字符串,长度不超过200。
输出
每行输出一个样例的结果。
样例输入
UDLRXY LUUDD UULDD
样例输出
1 4 3
解题思路
模拟,很多人第一反应是声明一个数组记录六个面的状态,但通过一番观察不难发现,题目中的骰子相对的两个面数字之和为7。有了这种特殊的规律,只需记录顶面、正面和左面三个面的数字就能描述所有面的状态。
例如,当指令为'U'时,要把骰子向上旋转,顶面数字将变为原来的正面数字,正面的数字将变成原来的底面的数字(即7减去顶面数字),左面的数字不变。则可以表示为
if(instruct[i]=='U'){temp=7-pose[0];pose[0]=pose[1];pose[1]=temp;
}
完整代码如下
#include <stdio.h>
int main()
{char instruct[205];int i,temp;int pose[3];while(scanf("%s",instruct)!=EOF){pose[0]=1;pose[1]=5;pose[2]=3;for(i=0;instruct[i];++i){if(instruct[i]=='U'){temp=7-pose[0];pose[0]=pose[1];pose[1]=temp;}else if(instruct[i]=='D'){temp=7-pose[1];pose[1]=pose[0];pose[0]=temp;}else if(instruct[i]=='L'){temp=7-pose[2];pose[2]=pose[0];pose[0]=temp;}else if(instruct[i]=='R'){temp=7-pose[0];pose[0]=pose[2];pose[2]=temp;}else if(instruct[i]=='X'){temp=7-pose[2];pose[2]=pose[1];pose[1]=temp;}else if(instruct[i]=='Y'){temp=7-pose[1];pose[1]=pose[2];pose[2]=temp;}}printf("%d\n",pose[0]);}return 0;
}