Advertisement
NaZaRa

hydra.c (Kirby-Paris Hydras)

Aug 10th, 2015
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.19 KB | None | 0 0
  1. #include "ggy.h"
  2.  
  3. struct hydra {
  4.         int children_count;
  5.         struct hydra **children;
  6.         struct hydra *parent;
  7. };
  8.  
  9. struct hydra *duplicate_hydra(struct hydra *hydra)
  10. {
  11.         int i;
  12.         struct hydra dup;
  13.  
  14.         dup.children_count = hydra->children_count;
  15.         dup.parent = hydra->parent;
  16.  
  17.         for (i = 0 ; i < dup.children_count ; dup.children[i] = duplicate_hydra(hydra->children[i]));
  18.  
  19.         return &dup;
  20. }
  21.  
  22. void unlink_hydra(struct hydra *hydra)
  23. {
  24.         int i, j;
  25.         struct hydra *parent = hydra->parent;
  26.  
  27.         if (parent->children_count == 1) {
  28.                 parent->children_cound = 0;
  29.                 parent->children = NULL;
  30.         }
  31.         else {
  32.                 for (i = 0 ; i < parent->children_count && parent->children[i] != hydra ; i++);
  33.                 for (j = i + 1 ; j < parent->children_count ; parent->children[j - 1] = parent->children[i]);
  34.  
  35.                 parent->children_count--;
  36.                 parent->children[parent->children_count] = NULL;
  37.         }
  38.  
  39. }
  40.  
  41. int solve_hydra(struct hydra *hydra, int n)
  42. {
  43.         struct hydra *parent = hydra->parent;
  44.         struct hydra *pparent = parent->parent;
  45.  
  46.         if (hydra->children) {
  47.                 unlink_hydra(hydra);
  48.  
  49.                 if (pparent == NULL) {
  50.                         return n + 1;
  51.                 }
  52.  
  53.                 int i;
  54.                 for (i = n ; i ; i--) {
  55.                         pparent->children_count++;
  56.                         pparent->children[pparent->children_count - 1] = duplicate_hydra(parent);
  57.                 }
  58.         }
  59.         else {
  60.                 return solve_hydra(hydra->children[hydra->children_count - 1], n + 1);
  61.         }
  62. }
  63.  
  64. int Hydra(int x)
  65. {
  66.         int i;
  67.         struct hydra *tmp[x];
  68.  
  69.         for (i = 0 ; i < x ; i++) {
  70.                 struct hydra hydra;
  71.  
  72.                 hydra.children_count = 1;
  73.                 hydra.children = NULL;
  74.                 hydra.parent = (i > 0 ? tmp[i - 1] : NULL);
  75.  
  76.                 tmp[i] = &hydra;
  77.  
  78.                 if (i > 0) {
  79.                         tmp[i - 1]->children = &hydra;
  80.                 }
  81.  
  82.         }
  83.  
  84.         return solve_hydra(tmp[0], 1);
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement