51 lines
4.9 KiB
C
51 lines
4.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
|
|
typedef
|
|
#define U realloc
|
|
#define r(n,a,b,c) \
|
|
case n :return(B){a ,b,c}
|
|
struct B{int x,y,z ;}B;inline static
|
|
B S( B a,B b){ return(B){a. x-b.x,a.y-
|
|
b. y ,a.z-b.z};} typedef struct Q{int c,e;B*
|
|
R; }Q;inline static int M( B a,B b){ return abs(a.x-b.
|
|
x)+abs(a.y-b .y)+abs(a.z- b.z);}const size_t Z= sizeof(B)
|
|
,q=sizeof (Q);inline static B T(B b,int i){int x=b.x,y=b.y ,z=b.z;
|
|
switch(i){r( 0,x,y,z);r( 1,x,-y,-z);r (2,x,z,-y);r (3,x,-z,y);r (4,y,x,-z
|
|
);r( 5,y,-x,z); r(6,y,z,x);r (7,y,-z,-x); r(8,z,x,y);r (9,z,-x,-y );r(
|
|
10,z ,y,-x);r(11,z,-y,x) ;r(12,-x,y,- z);r(13,-x, -y,z);r(14 ,-x,
|
|
z,y) ;r(15,-x ,-z,-y);r( 16,-y,x,z);r( 17,-y,-x,-z );r(
|
|
18, -y,z,-x);r(19 ,-y,-z,x);r( 20,-z,x,-y );r(
|
|
21,- z,-x,y) ;r(22,-z,y,x );r(23,- z,-
|
|
y,- x);} return(B){0};} int
|
|
main (){Q*E=NULL;getchar(); int
|
|
n,e =1,I=0,G =0,i
|
|
=0, j,m ;while (scanf ("-"
|
|
"- " "scanner " "%d " "---\n" ,&n
|
|
)== 1){n++;E=U(E,n *q );Q* s =& E[ n-1];s ->R=
|
|
NULL ;s->c =1;s ->e=n== 1;B b;while (scanf (""""
|
|
"%i" ",%i," "%i", & b.x, &b.y,&b. z)==3) {s->R =U(s
|
|
->R ,++s ->c *Z) ; s -> R[s ->c-1 ]=b;I++;} scanf( "%*""[" "^-"
|
|
"]" );memset(&s-> R[0],0 ,Z);}B *W;W =malloc( I*Z);I= E[0].c;memcpy(W,E [0].
|
|
R,I *Z);while(e<n ) for( int i= 0;i< n;i++) for(int m=0 ;m< 24;m++){ int r
|
|
,y, u,o,p ,a, d,f,g; if(!E[ i].e )for(r =0; r< I;r++) for(y
|
|
=1; y<E[i ].c;y ++){g= 0;B D=S(T( E[i].R [y],m), W[r]
|
|
) ; for(u =1;u<E [i].c; u++) {B c=S (T(E[i ].R[u], m),D
|
|
) ; for(o =0;o<I ;o ++) if(! memcmp (&c,&W [o],Z)) {g++
|
|
;if (g >= 12){ { B Y[E[ i].c -1];p= 0;for( a=1;a< E[i] .c;a
|
|
++) { B t=S( T(E[i] .R[a ],m),D );f=0; for(d= 0;d<
|
|
I;d ++)if(! memcmp ( &t ,& W[d ],Z )) { f++;
|
|
break ;}if( !f ) Y [ p ++]=t;} memcpy (W+I
|
|
,Y,p *Z);I+= p;E[i] .R[0 ]=(B){-D. x,-D
|
|
.y,-D. z};E[i].e= 1;e ++;
|
|
printf("" "%d/" "%d\n",
|
|
e, n);} goto X;}}}}X:
|
|
}for(;i< n;i ++)for(j=
|
|
0;j<n;j ++){ m=M(E[i]
|
|
.R[0],E[ j].R [0]);if(
|
|
m>G) G= m ;} printf(""
|
|
"Silver: %d\nGold: %d\n",I
|
|
-1,G) ;}
|