import java.util.*; public class Connect { public static void main( String[] arg ) { int nCase = 1; for(Scanner sc = new Scanner(System.in) ;; ++nCase) { int N = sc.nextInt(); if( N == 0 ) return; assert 2<=N && N<=14 : "\n N (number of linesegs) is out-of-range"; double sumlen = 0; double[] xa = new double[N]; double[] ya = new double[N]; double[] xb = new double[N]; double[] yb = new double[N]; for(int i=0; i m = new HashMap(); // singleton case for(int i=0; i m2 = new HashMap(); for( Map.Entry kv : m.entrySet() ) { int k = kv.getKey(); int ks = k & (1<> N; double kx = ((ki&1)==0 ? xa : xb)[ki>>1]; double ky = ((ki&1)==0 ? ya : yb)[ki>>1]; double v = kv.getValue(); for(int i=0; iv2 ) m2.put( k2, v2 ); k2 = ks|(1<v2 ) m2.put( k2, v2 ); } } m = m2; } // find the minimum double v = Double.MAX_VALUE; for( double vv : m.values() ) v = Math.min( v, vv ); System.out.printf( "Case %d: %.9f\n", nCase, v+sumlen ); } } static double len(double x, double y, double X, double Y) { return Math.sqrt( (x-X)*(x-X) + (y-Y)*(y-Y) ); } }