让我们一起来看下,一个放在桌面上的骰子,如图1 所示:
图1 初始方位
数字1在上方,数字2在South(南)方位,数字3在East(东)方位。每一对相反方位的数字之和是7,按照上述规则,数字5在North(北)方位,数字4在West(西)方位, 数字6在下方,如图1 所示,数字4,5,6在图1中是看不到的。
骰子的初始位置如图1所示,按照下列6条规则旋转骰子,规则如图2和图3所示:
图2:旋转规则North(北)、 East(东) 、West(西)、 South(南)
图2中所示的4条旋转规则是将骰子按照规则指定的方位旋转90度。
图3中所示的2条旋转规则是将骰子沿水平方向分别向Left(左)或Right(右)方位旋转90度。
图3:旋转规则Left(左)、Right(右)
你的任务是编写一个程序,从图1所示的方位开始,根据给定的一系列规则连续的旋转骰子,程序要求输出旋转骰子过程中位于上方的数字之和(其中包括图1所示的初始方位上方的数字1)。
题解:
模拟。
代码:
var
a:array[1..6]of longint=(1,6,2,3,5,4);
n:longint;
procedure jh(x,y:longint);
var
z:longint;
begin
z:=a[x];a[x]:=a[y];a[y]:=z;
end;
procedure init;
var
i,ans:longint;
s:string;
begin
readln(n);ans:=a[1];
for i:=1 to n do
begin
readln(s);
if s='North' then
begin
jh(1,3);
jh(2,5);
jh(3,5);
end;
if s='East' then
begin
jh(1,6);
jh(2,4);
jh(4,6);
end;
if s='West' then
begin
jh(1,4);
jh(2,6);
jh(4,6);
end;
if s='South' then
begin
jh(1,5);
jh(2,3);
jh(3,5);
end;
if s='Right' then
begin
jh(5,6);
jh(4,6);
jh(3,6);
end;
if s='Left' then
begin
jh(3,6);
jh(4,6);
jh(5,6);
end;
ans:=ans+a[1];
end;
writeln(ans);
end;
begin
init;
end.
a:array[1..6]of longint=(1,6,2,3,5,4);
n:longint;
procedure jh(x,y:longint);
var
z:longint;
begin
z:=a[x];a[x]:=a[y];a[y]:=z;
end;
procedure init;
var
i,ans:longint;
s:string;
begin
readln(n);ans:=a[1];
for i:=1 to n do
begin
readln(s);
if s='North' then
begin
jh(1,3);
jh(2,5);
jh(3,5);
end;
if s='East' then
begin
jh(1,6);
jh(2,4);
jh(4,6);
end;
if s='West' then
begin
jh(1,4);
jh(2,6);
jh(4,6);
end;
if s='South' then
begin
jh(1,5);
jh(2,3);
jh(3,5);
end;
if s='Right' then
begin
jh(5,6);
jh(4,6);
jh(3,6);
end;
if s='Left' then
begin
jh(3,6);
jh(4,6);
jh(5,6);
end;
ans:=ans+a[1];
end;
writeln(ans);
end;
begin
init;
end.