/* * Sample solution to the Hexagon problem. * Central Europe Regional Contest 2007. * * Jan Cibulka, 2007 */ #include #include #include #define MAXN 100000 int vcnt; int neig[MAXN+2][6]; int neigcnt[MAXN+2]; int inset[MAXN+2]; int conn[MAXN+2][18]; int h; int vis[MAXN+2]; int get_inset() { char pomc; pomc='\0'; scanf(" %c ",&pomc); if(pomc!='.') { assert(pomc>='A' && pomc<='D'); return (pomc-'A'); } else return -1; } int ciphsum(int b) { return (b&1) + (b&2)/2 + (b&4)/4 + (b&8)/8; } void dij(int req) { int i,j,k,l,tmp,mindist; int v; int cur; for(i=0;i<16;i++) for(j=i;j<16;j++) if((j&i)==0) for(k=j;k<16;k++) if((k&i)==0 && (k&j)==0) for(l=k;l<16;l++) if((l&i)==0 && (l&j)==0 && (l&k)==0) if((i|j|k|l) == req) { for(v=0;v=0); if(conn[v][req]<0 || conn[v][req]>tmp) conn[v][req] = tmp; } } for(i=0;i=0) { if(cur==-1 || conn[i][req]conn[cur][req]+1) conn[tmp][req] = conn[cur][req]+1; } } for(i=0;i=0); for(i=0;i<4;i++) { mindist = -1; for(j=0;j=2 && h<=100); vcnt = 0; for(i=0;i0 && j>0) neig[vcnt][neigcnt[vcnt]++]=vcnt-(h+i); if(i>0 && j0) neig[vcnt][neigcnt[vcnt]++]=vcnt-1; if(j0) neig[vcnt][neigcnt[vcnt]++]=vcnt-(h+i); if(j0) neig[vcnt][neigcnt[vcnt]++]=vcnt-1; if(j0) neig[vcnt][neigcnt[vcnt]++]=vcnt+h+i-1; if(j=0;i--) { for(j=0;j0) neig[vcnt][neigcnt[vcnt]++]=vcnt-1; if(j0 && j>0) neig[vcnt][neigcnt[vcnt]++]=vcnt+(h+i-1); if(i>0 && j