【JZOJ 4628】立方体

5 篇文章 0 订阅
3 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值