Cod sursa(job #253374)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 18:34:32
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
 #include <stdio.h>  
 #include <math.h>  
 #include <string.h>  
   
 #define mare 1000000000  
   
 long num, v[32], q1[32], w1[32], n, q2[32], w2[32], c[131072][18], dpn, rez, i, j, x, k, j2, k2;  
   
 void copy() {  
     memcpy(q1, q2, sizeof(q1));  
     memcpy(w1, w2, sizeof(w1));  
 }  
   
 void afla1() {  
     while (1) {  
         scanf("%ld", &x);  
         if (x == 1) break;  
         ++n;  
         scanf("%ld %ld", &q2[n], &w2[n]);  
     }  
 }  
   
 long MIN(long a, long b) {   
     if (a < b) {  
         return a;  
     }  
     return b;  
 }  
   
 void afla2() {  
     dpn = 1 << n;  
     for (i = 1; i < dpn; i++) {  
         for (j = 1, k = 1; j <= i; j <<= 1, ++k) {  
             if (j & i) {  
                 c[i][k] = mare;  
                 if (j == i) {  
                     for (j2 = 1; j2 <= num; ++j2) {  
                         c[i][k] = MIN(c[i][k], (long)(v[j2] + (q2[k] - q1[j2]) * (q2[k] - q1[j2]) + (w2[k] - w1[j2]) * (w2[k] - w1[j2])));  
                     }  
                 } else {  
                     for (j2 = 1, k2 = 1; j2 <= i; j2 <<= 1, ++k2) {  
                         if ((j2 & i) && j2 != j) {  
                             c[i][k] = MIN(c[i][k], c[i ^ j][k2] + (q2[k] - q2[k2]) * (q2[k] - q2[k2]) + (w2[k] - w2[k2]) * (w2[k] - w2[k2]));  
                         }  
                     }  
                 }  
             }  
         }  
     }  
 }  
   
 int main() {  
     freopen("bibel.in", "r", stdin);  
     freopen("bibel.out", "w", stdout);  
   
     for (i = 1; i < 20; i++) {  
         v[i] = mare;  
     }  
     v[1] = 0;  
     num = 1;  
   
     while (1) {  
         scanf("%ld", &x);  
         if (x == 2) {  
             break;  
         }  
         n = 1;  
         scanf("%ld %ld", &q2[1], &w2[1]);  
         afla1();  
         afla2();  
         num = n;  
         copy();  
         rez = mare;  
         for (i = 1; i <= n; ++i) {  
             v[i] = c[dpn - 1][i];  
             if (v[i] < rez) {  
                 rez = v[i];  
             }  
         }  
         printf("%ld \n", rez);  
     }  
     return 0;  
}