color[n][0]存当前最底面颜色为n时能摆成最高的塔,color[n][1],color[n][2]存的是此塔底的位置,输出结果时的front、back这些指的是当前木块的上面
#include<stdio.h>
#include<string.h>
int n;
int color[111][3],max[3],tmp[111][3];
struct node{
int s,x,qi,qj;
}cube[512][6];
int main()
{
int i,j,k,l,m;
for(m=1;;m++)
{
scanf("%d",&n);
if(!n)
break;
memset(cube,0,sizeof(cube));
memset(color,0,sizeof(color));
memset(max,-1,sizeof(max));
for(i=1;i<=n;i++)
{
for(j=0;j<6;j=j+2)
{
int a,b;
scanf("%d %d",&a,&b);
cube[i][j].s=b;
cube[i][j].x=a;
cube[i][j+1].s=a;
cube[i][j+1].x=b;
}
}
for(j=0;j<6;j++)
{
int di=cube[1][j].x;
color[di][0]=1;
color[di][1]=1;
color[di][2]=j;
max[0]=1;
max[1]=1;
max[2]=j;
}
for(i=2;i<=n;i++)
{
int ding,di;
memcpy(tmp,color,sizeof(color));
for(j=0;j<6;j++)
{
ding=cube[i][j].s;
di=cube[i][j].x;
if(color[ding][0]+1>color[di][0]&&color[ding][1]!=i)
{
if(color[ding][0]+1>=tmp[di][0])
{
tmp[di][1]=i;
tmp[di][2]=j;
cube[i][j].qi=color[ding][1];
cube[i][j].qj=color[ding][2];
tmp[di][0]=color[ding][0]+1;
if(tmp[di][0]>max[0])
{
max[0]=tmp[di][0];
max[1]=tmp[di][1];
max[2]=tmp[di][2];
}
}
}
}
memcpy(color,tmp,sizeof(tmp));
}
printf("Case #%d\n",m);
printf("%d\n",max[0]);
int path[511][2],count=0;
path[count][0]=max[1];
path[count][1]=max[2];
int pi=max[1],pj=max[2];
while(pi!=0)
{
int ti,tj;
ti=pi;
tj=pj;
count++;
pi=cube[ti][tj].qi;
pj=cube[ti][tj].qj;
path[count][0]=pi;
path[count][1]=pj;
}
for(i=max[0]-1;i>=0;i--)
{
printf("%d ",path[i][0]);
if(path[i][1]==1)
printf("front\n");
else if(path[i][1]==0)
printf("back\n");
else if(path[i][1]==3)
printf("left\n");
else if(path[i][1]==2)
printf("right\n");
else if(path[i][1]==5)
printf("top\n");
else if(path[i][1]==4)
printf("bottom\n");
}
printf("\n");
}
return 0;
}