10051 - Tower of Cubes

描述:麻烦的题,需要记录走过的路程,而且和最短路还有些车别
#include <cstdio>
struct cube
{
    int val;
    int sum;
    int no;
    int x;
    int y;
};
cube v[510][6];
char str[6][7]= {"front","back","left","right","top","bottom"};
int main()
{
    //freopen("a.txt","r",stdin);
    int n,p[6],flag[6][2],q[6],m[2],sum,t=0;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n) break;
        if(t) puts("");
        for(int i=0; i<n; i++)
            for(int j=0; j<6; j++)
            {
                scanf("%d",&v[i][j].val);
                v[i][j].sum=1;
                v[i][j].no=v[i][j].x=v[i][j].y=-1;
            }
        sum=0,m[0]=m[1]=-1;
        for(int i=n-2; i>=0; i--)
        {
            for(int j=0; j<6; j++)
            {
                p[j]=0;
                q[j]=flag[j][1]=flag[j][0]=-1;
            }
            for(int j=i+1; j<n; j++)
                for(int k=0; k<6; k++)
                    for(int l=0; l<6; l++)
                        if(v[j][l].val==v[i][k].val)
                        {
                            int c;
                            if(l%2==0) c=l+1;
                            else c=l-1;
                            if(p[k]>=v[j][c].sum) continue;
                            q[k]=l;
                            flag[k][0]=j;
                            flag[k][1]=c;
                            p[k]=v[j][c].sum;
                        }
            for(int j=0; j<6; j++)
            {
                v[i][j].sum+=p[j];
                v[i][j].x=flag[j][0];
                v[i][j].y=flag[j][1];
                v[i][j].no=q[j];
                if(v[i][j].sum>sum)
                {
                    sum=v[i][j].sum;
                    m[0]=i;
                    m[1]=j;
                }
            }
        }
        printf("Case #%d\n%d\n",++t,sum);
        int c,a=m[0],b=m[1];
        if(m[1]%2==0) c=m[1]+1;
        else c=m[1]-1;
        printf("%d %s\n",m[0]+1,str[c]);
        c=v[a][b].no;
        m[0]=v[a][b].x;
        m[1]=v[a][b].y;
        while(1)
        {
            if(m[1]==-1||m[0]==-1) break;
            printf("%d %s\n",m[0]+1,str[c]);
            a=m[0],b=m[1];
            c=v[a][b].no;
            m[0]=v[a][b].x;
            m[1]=v[a][b].y;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值