commit e9232dce6a562737ad59b6b916959b94a85571b6
parent 8e85724219948ad0b6b57836d80f4d9311557fac
Author: Antoine Amarilli <a3nm@a3nm.net>
Date:   Sat, 28 Mar 2015 13:59:14 +0100
refactor
Diffstat:
| contest/a3nm/main.cpp |  |  | 204 | ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- | 
1 file changed, 125 insertions(+), 79 deletions(-)
diff --git a/contest/a3nm/main.cpp b/contest/a3nm/main.cpp
@@ -57,6 +57,112 @@ void calccoverage() {
           coverage[r][c].push_back(l);
 }
 
+int decide_dyn(int b, int t, int a, int r, int c) {
+  return dir[t][a][r][c];
+}
+
+int decide_sol(int b, int t, int a, int r, int c) {
+  return solution[t][b];
+}
+
+int simulate(int b, int (*decide)(int, int, int, int, int)) {
+  // return totscore
+  //
+  // ok now follow the best
+  int totscore = 0;
+  int r = rs, c = cs, a = 0;
+  for (int t = 0; t < T; t++) {
+    //printf("loon %d at time %d is %d %d %d\n", b, t, a, r, c);
+    int bestda = (*decide)(b, t, a, r, c);
+    //printf("i choose %d\n", bestda);
+    // ok, apply bestda
+    a += bestda;
+    solution[t][b] = bestda;
+    Pt next = dest[a][r][c];
+    r = next.r;
+    c = next.c;
+    if (r < 0) {
+      //printf("FAILLL\n");
+      break; // loon is out
+    }
+    if (a > 0 && r >= 0) {
+      // update covered targets
+      //printf("coverage %d %d\n", r, c);
+      for (unsigned int i = 0; i < coverage[r][c].size(); i++) {
+        int l = coverage[r][c][i];
+        totscore += covered[t+1][l] ? 0 : 1;
+        covered[t+1][l] = true;
+      }
+    }
+  }
+  return totscore;
+}
+
+
+int planify(int b) {
+  // planify one loon, b, based on the info of covered
+  // return totscore
+  int totscore = 0;
+  // compute left
+  for (int t = 0; t <= T; t++)
+    for (int r = 0; r < R; r++)
+      for (int c = 0; c < C; c++) {
+        int cscore = 0;
+        for (unsigned int i = 0; i < coverage[r][c].size(); i++) {
+          int l = coverage[r][c][i];
+          cscore += covered[t][l] ? 0 : 1;
+        }
+        left[t][r][c] = cscore;
+      }
+  // planify loon b, t == T is sentinel
+  for (int t = 0; t <= T; t++)
+    for (int a = 0; a <= A; a++)
+      for (int r = 0; r < R; r++)
+        for (int c = 0; c < C; c++)
+          tab[t][a][r][c] = dir[t][a][r][c] = 0;
+  for (int t = T-1; t >= 0; t--) {
+    for (int a = 0; a <= A; a++)
+      for (int r = 0; r < R; r++)
+        for (int c = 0; c < C; c++) {
+          int bestda = 0, best = 0;
+          for (int da = -1; da <= 1; da++) {
+            if (a <= 1 && da < 0)
+              continue;
+            if (a + da > A)
+              continue;
+            Pt next = dest[a + da][r][c];
+            if (next.r < 0)
+              break;
+            int rscore = ((a + da) > 0 ? left[t+1][next.r][next.c] : 0) +
+              tab[t+1][a+da][next.r][next.c];
+            if (rscore > best || (rscore == best && da > bestda)) {
+              best = rscore;
+              bestda = da;
+            }
+          }
+          tab[t][a][r][c] = best;
+          dir[t][a][r][c] = bestda;
+        }
+  }
+  simulate(b, &decide_dyn);
+  return totscore;
+}
+
+void print_sol(int totscore) {
+  FILE *f = fopen("output", "w");
+  
+  // print solution
+  fprintf(f, "score %d\n", totscore);
+
+  for (int t = 0; t < T; t++) {
+    for (int b = 0; b < B; b++)
+      fprintf(f, "%d ", solution[t][b]);
+    fprintf(f, "\n");
+  }
+
+  fclose(f);
+}
+
 int main(int argc, char **argv) {
   scanf("%d%d%d", &R, &C, &A);
   scanf("%d%d%d%d", &L, &V, &B, &T);
@@ -91,86 +197,26 @@ int main(int argc, char **argv) {
 
   int totscore = 0;
 
-  for (int b = 0; b < B; b++) {
-    // compute left
-    for (int t = 0; t <= T; t++)
-      for (int r = 0; r < R; r++)
-        for (int c = 0; c < C; c++) {
-          int cscore = 0;
-          for (unsigned int i = 0; i < coverage[r][c].size(); i++) {
-            int l = coverage[r][c][i];
-            cscore += covered[t][l] ? 0 : 1;
-          }
-          left[t][r][c] = cscore;
-        }
-    // planify loon b, t == T is sentinel
-    for (int t = 0; t <= T; t++)
-      for (int a = 0; a <= A; a++)
-        for (int r = 0; r < R; r++)
-          for (int c = 0; c < C; c++)
-            tab[t][a][r][c] = dir[t][a][r][c] = 0;
-    for (int t = T-1; t >= 0; t--) {
-      for (int a = 0; a <= A; a++)
-        for (int r = 0; r < R; r++)
-          for (int c = 0; c < C; c++) {
-            int bestda = 0, best = 0;
-            for (int da = -1; da <= 1; da++) {
-              if (a <= 1 && da < 0)
-                continue;
-              if (a + da > A)
-                continue;
-              Pt next = dest[a + da][r][c];
-              if (next.r < 0)
-                break;
-              int rscore = ((a + da) > 0 ? left[t+1][next.r][next.c] : 0) +
-                tab[t+1][a+da][next.r][next.c];
-              if (rscore > best || (rscore == best && da > bestda)) {
-                best = rscore;
-                bestda = da;
-              }
-            }
-            tab[t][a][r][c] = best;
-            dir[t][a][r][c] = bestda;
-          }
-    }
-    // ok now follow the best
-    int r = rs, c = cs, a = 0;
-    for (int t = 0; t < T; t++) {
-      printf("loon %d at time %d is %d %d %d\n", b, t, a, r, c);
-      int bestda = dir[t][a][r][c];
-      printf("i choose %d\n", bestda);
-      // ok, apply bestda
-      a += bestda;
-      solution[t][b] = bestda;
-      Pt next = dest[a][r][c];
-      r = next.r;
-      c = next.c;
-      if (r < 0) {
-        printf("FAILLL\n");
-        break; // loon is out
-      }
-      if (a > 0 && r >= 0) {
-        // update covered targets
-        printf("coverage %d %d\n", r, c);
-        for (unsigned int i = 0; i < coverage[r][c].size(); i++) {
-          int l = coverage[r][c][i];
-          totscore += covered[t+1][l] ? 0 : 1;
-          covered[t+1][l] = true;
-        }
-      }
-    }
-  }
-
-  // print solution
-  printf("score %d\n", totscore);
+  for (int b = 0; b < B; b++)
+    totscore += planify(b);
+
+  print_sol(totscore);
+
+  // srand(42);
+  // while(true) {
+  //   int br = (rand() % B);
+  //   for (int t = 0; t <= T; t++)
+  //     for (int l = 0; l < L; l++)
+  //       covered[t][l] = false;
+  //   // now simulate
+  //   totscore = 0;
+  //   for (int b = 0; b < B; b++) {
+  //     if (br == b)
+  //       continue;
+  //   }
+  //   
+  // }
 
-  for (int t = 0; t < T; t++) {
-    for (int b = 0; b < B; b++)
-      printf("%d ", solution[t][b]);
-    printf("\n");
-  }
-    
   return 0;
 }
 
-