Advertisement
Guest User

Robot

a guest
Mar 22nd, 2021
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.30 KB | None | 0 0
  1. #include <assert.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define N 5
  6. #define MAX (N*N)
  7. #define MUUR 1000
  8. #define LEEG 1001
  9. #define PAD 1002
  10. #define MAXAFSTAND (1 << 30)
  11.  
  12. typedef struct {
  13.   int x;
  14.   int y;
  15.   int waarde;
  16. } Vakje;
  17.  
  18. void print(int a[N][N]) {
  19.   for (int i = 0; i < N; ++i) {
  20.     for (int j = 0; j < N; ++j) {
  21.       switch (a[i][j]) {
  22.       case MUUR:
  23.         printf("  # ");
  24.         break;
  25.       case LEEG:
  26.         printf("    ");
  27.         break;
  28.       case PAD:
  29.         printf("  + ");
  30.         break;
  31.       default:
  32.         printf(" %2d ", a[i][j]);
  33.       }
  34.     }
  35.     printf("\n");
  36.   }
  37. }
  38.  
  39. int totaleAfstand(Vakje pad[MAX], int n) {
  40.   int afstand = 0;
  41.   for (int i = 0; i < n; ++i) {
  42.     afstand += pad[i].waarde;
  43.   }
  44.   return afstand;
  45. }
  46.  
  47. void printPad(Vakje pad[MAX], int n) {
  48.   int a[N][N];
  49.   for (int i = 0; i < N; ++i) {
  50.     for (int j = 0; j < N; ++j) {
  51.       a[i][j] = LEEG;
  52.     }
  53.   }
  54.   for (int i = 0; i < n; ++i) {
  55.     Vakje p = pad[i];
  56.     if (p.x < N && p.x >= 0 && p.y < N && p.x >= 0) {
  57.       a[pad[i].x][pad[i].y] = PAD;
  58.     }
  59.   }
  60.   printf("lengte: %d\n", n);
  61.   printf("afstand: %d\n", totaleAfstand(pad, n));
  62.   print(a);
  63. }
  64.  
  65. int aantalUitbreidingen(Vakje pad[MAX], int* lengte) { return 4; }
  66.  
  67. void maakVolgendeUitbreiding(int a[N][N], Vakje pad[MAX], int* lengte,
  68.                              int buur) {
  69.   int n = *lengte;
  70.   assert(n > 0);
  71.   *lengte = n + 1;
  72.   pad[n] = pad[n - 1];
  73.   if (buur == 0) {
  74.     pad[n].x -= 1;
  75.   } else if (buur == 1) {
  76.     pad[n].y -= 1;
  77.   } else if (buur == 2) {
  78.     pad[n].x += 1;
  79.   } else if (buur == 3) {
  80.     pad[n].y += 1;
  81.   }
  82.   pad[n].waarde = a[pad[n].x][pad[n].y];
  83. }
  84.  
  85. int besteAfstand = MAXAFSTAND;
  86. int besteLengte = 0;
  87. Vakje bestePad[MAX];
  88.  
  89. void backtrack(Vakje pad[MAX], int* lengte) {
  90.   assert(*lengte > 0);
  91.   *lengte = *lengte - 1;
  92. }
  93.  
  94. int test(int a[N][N], Vakje pad[MAX], int lengte) {
  95.   if (lengte >= MAX) {
  96.     return 0;
  97.   }
  98.   for (int i = 0; i < lengte; ++i) {
  99.     Vakje p = pad[i];
  100.     if (p.x < 0 || p.x >= N || p.y < 0 || p.y >= N || a[p.x][p.y] == MUUR) {
  101.       return 0;
  102.     }
  103.   }
  104.   if (totaleAfstand(pad, lengte) >= besteAfstand) {
  105.     return 0;
  106.   }
  107.   return 1;
  108. }
  109.  
  110. int isCompleet(Vakje pad[MAX], int lengte) {
  111.   return pad[lengte - 1].x == N - 1 && pad[lengte - 1].y == N - 1;
  112. }
  113.  
  114. void registreer(Vakje pad[MAX], int lengte) {
  115.   assert(totaleAfstand(pad, lengte) < besteAfstand);
  116.   besteAfstand = totaleAfstand(pad, lengte);
  117.   besteLengte = lengte;
  118.   for (int i = 0; i < lengte; ++i) {
  119.     bestePad[i] = pad[i];
  120.   }
  121. }
  122.  
  123. void zoek(int a[N][N], Vakje pad[MAX], int lengte) {
  124.   if (!test(a, pad, lengte)) {
  125.     return;
  126.   }
  127.   if (isCompleet(pad, lengte)) {
  128.     printPad(pad, lengte);
  129.     registreer(pad, lengte);
  130.     return;
  131.   }
  132.   for (int i = 0; i < aantalUitbreidingen(pad, &lengte); ++i) {
  133.     maakVolgendeUitbreiding(a, pad, &lengte, i);
  134.     zoek(a, pad, lengte);
  135.     backtrack(pad, &lengte);
  136.   }
  137. }
  138.  
  139. int main() {
  140.   int a[N][N] = {
  141.       {1, 1, 1, 1, 1},        
  142.       {5, MUUR, MUUR, MUUR, 1},
  143.       {1, 2, 1, 1, 1},
  144.       {1, 3, 10, MUUR, MUUR},
  145.       {1, 15, 1, 1, 1},
  146.   };
  147.  
  148.   print(a);
  149.  
  150.   Vakje pad[MAX];
  151.   pad[0].x = 0;
  152.   pad[0].y = 0;
  153.   pad[0].waarde = a[0][0];
  154.   int lengte = 1;
  155.  
  156.   zoek(a, pad, lengte);
  157.   printPad(bestePad, besteLengte);
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement