题目の描述
input
sample input
e2 e3 0 8 1 2 1 1
output
sample output
5
Data Constraint
看到数据范围,第一反应当然是萌萌的爆搜,但是这题暴力复杂度 O(2q)(q为走的步数) ,而且比正解还难打233
然而很多状态都是没有用的,于是我们想到了DP,设F[I,J,X,Y,Z]表示当前的位置在(x,y),当前“色子”的前面是X,下面是Y,右面是Z。(这样就可以表示出六个位子对应的数了)
一个状态显然只与ta的上一步有关~那么我们可以开滚动数组
F[I,J,X,Y,Z]可以由4种状态转化而来,分别是:
f[i-1,j,b[y],x,z]+a[y]
f[i+1,j,y,b[x],z]+a[y]
f[i,j-1,x,b[z],y]+a[y]
f[i,j+1,x,z,b[y]]+a[y]
其中b[X]表示与X相对的那个面的编号
贴代码:
var
f,g:array[0..9,0..9,0..6,0..6,0..6]of longint;
a,b:array[0..6]of longint;
i,j,k,l,n,r,c,t1,t2,t3,t4,t5,x,y,z,ans,o:longint;
ch1,ch2,ch3,ch4:char;
function min(x,y:longint):longint;
begin
if xthen exit(x) else exit(y);
end;
begin
read(ch1);
read(ch2);
read(ch3);
read(ch3);
read(ch4);
for i:=1 to 6 do read(a[i]);
readln;
t1:=ord(ch1)-96;
t2:=ord(ch2)-48;
t3:=ord(ch3)-96;
t4:=ord(ch4)-48;
t5:=t1;
t1:=t2;
t2:=t5;
t5:=t3;
t3:=t4;
t4:=t5;
fillchar(f,sizeof(f),$7f div 3);
fillchar(g,sizeof(g),$7f div 3);
f[t1,t2,1,5,4]:=0;
b[1]:=2;
b[2]:=1;
b[3]:=5;
b[4]:=6;
b[5]:=3;
b[6]:=4;
ans:=1314520;
for o:=1 to 64 do
begin
for i:=1 to 8 do
for j:=1 to 8 do
for x:=1 to 6 do
for y:=1 to 6 do
for z:=1 to 6 do
begin
g[i,j,x,y,z]:=min(f[i-1,j,b[y],x,z]+a[y],f[i+1,j,y,b[x],z]+a[y]);
g[i,j,x,y,z]:=min(g[i,j,x,y,z],f[i,j-1,x,b[z],y]+a[y]);
g[i,j,x,y,z]:=min(g[i,j,x,y,z],f[i,j+1,x,z,b[y]]+a[y]);
end;
for x:=1 to 6 do
for y:=1 to 6 do
for z:=1 to 6 do
ans:=min(ans,g[t3,t4,x,y,z]);
f:=g;
end;
writeln(ans+a[5]);
end.
(好丑(有型)啊)