#include<stdio.h> #include<stdlib.h> #include<string.h> struct rect { int x; int y; int z; }r[100]; int bubblesort(struct rect* r,int n) { int i,j,t=n; struct rect temp; for(i=0;i<n;i++) { for(j=0;j<n-i-1;j++) { if(r[j].x<r[j+1].x) { temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; } if(r[j].x==r[j+1].x && r[j].y<r[j+1].y) { temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; } if(r[j].x==r[j+1].x && r[j].y==r[j+1].y && r[j].z<r[j+1].z) { temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; } } } for(i=1;i<t;i++) { if(r[i].x==r[i-1].x && r[i].y==r[i-1].y) { for(j=i;j<t;j++) { r[j]=r[j+1]; } t--; i--; } } return t; } int main() { int n,i,j,k,t,a,b,c,f[100],m,cas=0; while(scanf("%d",&n),n) { j=-1; cas++; memset(r,0,sizeof(r)); for(i=0;i<n;i++) { scanf("%d%d%d",&a,&b,&c); if(a==b&&b==c) { r[++j].x=a; r[j].y=b; r[j].z=c; } else if(a==b || b==c || a==c) { //调整为b==c if(a==b) { t=a; a=c; c=t; } if(a==c) { t=a; a=b; b=t; } // r[++j].x=b; r[j].y=c; r[j].z=a; //将较大的放在前面 if(a<b) { t=a; a=b; b=t; } r[++j].x=a; r[j].y=b; r[j].z=c; } else { if(a<b) { t=a; a=b; b=t; } if(b<c) { t=b; b=c; c=t; } if(a<b) { t=a; a=b; b=t; } r[++j].x=a; r[j].y=b; r[j].z=c; r[++j].x=b; r[j].y=c; r[j].z=a; r[++j].x=a; r[j].y=c; r[j].z=b; } } //依据x值进行排序 k=j+1; n=bubblesort(r,k); // printf("%d\n",n); // for(i=0;i<n;i++) // printf("%d %d %d\n",r[i].x,r[i].y,r[i].z); //以上实现了输入的排序且考虑了翻转,其中结构体中的x必然大于y k=n; f[k]=-1; for(i=0;i<k;i++) f[i]=r[i].z; for(i=k-1;i>=0;i--) { m=0; for(j=i+1;j<k;j++) { if(r[j].x<r[i].x && r[j].y<r[i].y) { if(m<f[j]) m=f[j]; } } f[i]+=m; } m=0; for(i=0;i<k;i++) { if(f[i]>m) m=f[i]; } printf("Case %d: maximum height = %d\n",cas,m); } return 0; }