立方体之塔 10051

来源:互联网 发布:js滚动条显示隐藏事件 编辑:程序博客网 时间:2024/04/30 05:07

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;}


原创粉丝点击