Description
Analysis
码农一道!
判重的话记录位置和色子的摆放情况。只用记录3个面。
然后,dfs模拟色子移动。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int ans,xs,xt,ys,yt,nq,nh,ns,ny,nx,nz,f[7],bz[9][9][7][7][7];
void pq(int &x,int &y,int &w)
{
x--;
int t=nx;
nx=nq,nq=ns,ns=nh,nh=t;
w+=f[nx];
}
void ph(int &x,int &y,int &w)
{
x++;
int t=nx;
nx=nh,nh=ns,ns=nq,nq=t;
w+=f[nx];
}
void pz(int &x,int &y,int &w)
{
y--;
int t=nx;
nx=nz,nz=ns,ns=ny,ny=t;
w+=f[nx];
}
void py(int &x,int &y,int &w)
{
y++;
int t=nx;
nx=ny,ny=ns,ns=nz,nz=t;
w+=f[nx];
}
void dfs(int x,int y,int w,int mq,int mh,int ms,int my,int mx,int mz)
{
if(w>=ans) return;
if(w>=bz[x][y][ms][mh][mz]) return;
bz[x][y][ms][mh][mz]=w;
if(x==xt && y==yt)
{
ans=w;
return;
}
if(x==1 && y==6 && w==9)
{
ans++;
ans--;
}
int x1=x,y1=y,w1=w;
nq=mq,nh=mh,ns=ms,ny=my,nx=mx,nz=mz;
if(x1>1)
{
pq(x1,y1,w1);
dfs(x1,y1,w1,nq,nh,ns,ny,nx,nz);
x1=x,y1=y,w1=w;
nq=mq,nh=mh,ns=ms,ny=my,nx=mx,nz=mz;
}
if(x1<8)
{
ph(x1,y1,w1);
dfs(x1,y1,w1,nq,nh,ns,ny,nx,nz);
x1=x,y1=y,w1=w;
nq=mq,nh=mh,ns=ms,ny=my,nx=mx,nz=mz;
}
if(y1>1)
{
pz(x1,y1,w1);
dfs(x1,y1,w1,nq,nh,ns,ny,nx,nz);
x1=x,y1=y,w1=w;
nq=mq,nh=mh,ns=ms,ny=my,nx=mx,nz=mz;
}
if(y1<8)
{
py(x1,y1,w1);
dfs(x1,y1,w1,nq,nh,ns,ny,nx,nz);
x1=x,y1=y,w1=w;
nq=mq,nh=mh,ns=ms,ny=my,nx=mx,nz=mz;
}
}
int main()
{
char cs,ct;
scanf("%c%d %c%d %d %d %d %d %d %d",&cs,&xs,&ct,&xt,&f[5],&f[6],&f[1],&f[2],&f[3],&f[4]);
ys=cs-'a'+1,yt=ct-'a'+1;
ans=2147483647;
memset(bz,127,sizeof(bz));
dfs(xs,ys,f[3],5,6,1,2,3,4);
printf("%d",ans);
return 0;
}