Advertisement
cmiN

suma

Mar 23rd, 2011
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3.  
  4. const unsigned int nMax = 0xffFF;
  5. const unsigned long inf = 0x7fFFffFF;
  6. FILE* fin, * fout;
  7. unsigned int*** cost, niv = 1, road[nMax], dl[] = {0, 0, 1, 1}, dc[] = {0, 1, 0, 1};
  8. unsigned long*** total, min = inf;
  9.  
  10. void init()
  11. {
  12.     unsigned int nr, sum = 0, i, j, c;
  13.     fin = fopen("suma.in", "rt");
  14.     fout = fopen("suma.out", "wt");
  15.     fscanf(fin, "%u", &nr);
  16.     while (sum < nr) {
  17.         cost = (unsigned int***) realloc(cost, niv * sizeof(unsigned int**));
  18.         total = (unsigned long***) realloc(total, niv * sizeof(unsigned long**));
  19.         cost[niv - 1] = (unsigned int**) malloc(niv * sizeof(unsigned int*));
  20.         total[niv - 1] = (unsigned long**) malloc(niv * sizeof(unsigned long*));
  21.         for (i = 0; i < niv; i++) {
  22.             cost[niv - 1][i] = (unsigned int*) malloc(niv * sizeof(unsigned int));
  23.             total[niv - 1][i] = (unsigned long*) malloc(niv * sizeof(unsigned long));
  24.             for (j = 0; j < niv; j++) {
  25.                 fscanf(fin, "%u", &c);
  26.                 cost[niv - 1][i][j] = c;
  27.                 total[niv - 1][i][j] = inf;
  28.             }
  29.         }
  30.         sum += niv * niv;
  31.         niv++;
  32.     }
  33.     niv--;
  34. }
  35.  
  36. void process()
  37. {
  38.     unsigned int i, j, k, d, sum = 1;
  39.     total[0][0][0] = cost[0][0][0];
  40.     road[0] = 1;
  41.     for (i = 1; i < niv; i++) {
  42.         min = inf;
  43.         for (j = 0; j < i; j++) {
  44.             for (k = 0; k < i; k++) {
  45.                 for (d = 0; d < 4; d++) {
  46.                     if (total[i - 1][j][k] + cost[i][j + dl[d]][k + dc[d]] < total[i][j + dl[d]][k + dc[d]]) {
  47.                         total[i][j + dl[d]][k + dc[d]] = total[i - 1][j][k] + cost[i][j + dl[d]][k + dc[d]];
  48.                         if (min > total[i][j + dl[d]][k + dc[d]]) {
  49.                             min = total[i][j + dl[d]][k + dc[d]];
  50.                             road[i] = sum + 1 + (j + dl[d]) * (i + 1) + (k + dc[d]);
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.         }
  56.         sum = sum + (i + 1) * (i + 1);
  57.     }
  58. }
  59.  
  60. void write()
  61. {
  62.     fprintf(fout, "%u %lu\n", niv, min);
  63.     for (unsigned int i = 0; i < niv; i++) {
  64.         fprintf(fout, "%u ", road[i]);
  65.     }
  66.     fclose(fin);
  67.     fclose(fout);
  68. }
  69.  
  70. int main()
  71. {
  72.     init();
  73.     process();
  74.     write();
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement