Advertisement
imarosi

Qhuszár

Aug 10th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. // Definiálok egy figurát, legyen a neve ideiglenesen Qhuszár, amely szintén L alakban léphet:
  2. // függőlegesen 3-t és vízszintesen egyet, vagy fordítva.
  3. // Ennek a figurának a különleges lépését "nagy lóugrásnak" neveztem el és nem az ellenkező színű
  4. // mezőre érkezik meg az eredeti helyzetéhez viszonyítva. Tehát azonos színű mezőkön ugrálhat.
  5. // Helyezzük el a Qhuszárt a sakktábla bal alsó a1-es sötét mezejére. A kérdés az, hogy ezzel a
  6. // figurával és hozzárendelt lépésével bejárható-e a sakktábla összes sötét mezője (összesen
  7. // 31 lépéssel) úgy, hogy minden mezőt csak egyszer érinthet?
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11.  
  12. // A tabla (...) korul "senki foldje" terulet (XXX) is van, hogy egyszerubb legyen
  13. // a lougras, ne kelljen ellenorizni, hogy kiugrik-e a huszar a tablabol.
  14. // Az XXX-eket eleve feltoltom majd, mintha ott mar jart volna a huszar, igy oda nem fog lepni.
  15. //
  16. // Az igy kibovitett sakktabla ilyen lesz: (Lentebb a tabla nevu egydimenzios tomb tarolja sorfolytonosan)
  17. //
  18. // X X X X X X X X X X X X
  19. //   X X X X X X X X X X X
  20. //   X X X X X X X X X X X
  21. //   : . . . . . . . X X X
  22. //   . . . . . . . . X X X
  23. //   . . . . . . . . X X X
  24. //   . . . . . . . . X X X
  25. //   . . . . . . . . X X X
  26. //   . . . . . . . . X X X
  27. //   . . . . . . . . X X X
  28. //   * . . . . . . . X X X:
  29. //   X X X X X X X X X X X
  30. //   X X X X X X X X X X X
  31. //   X X X X X X X X X
  32. //
  33. #define s_x (8+3)           // egy sor ilyen szeles
  34. #define s_y1 (3*s_x + 1)    // elso pozicio ':' elott ennyi van
  35. #define s_y2 (3*s_x - 2)    // utolso pozicio 'X:' utan ennyi van
  36.  
  37. #define POS(x,y) (s_y1 + (x) + s_x*(y)) // bal felso = ':' = (0,0)
  38. #define KEZD POS(0, 7)      // A1 = '*'
  39.  
  40. #define UTLEPES 32
  41.  
  42. char tabla[s_y1 + 8*s_x + s_y2];
  43.  
  44. int lep[] = {
  45.      3 + s_x*(1),
  46.      3 + s_x*(-1),
  47.      1 + s_x*(3),
  48.     -1 + s_x*(3),
  49.     -3 + s_x*(1),
  50.     -3 + s_x*(-1),
  51.      1 + s_x*(-3),
  52.     -1 + s_x*(-3)
  53. };
  54.  
  55. bool printall = false;
  56. int megoldasok = 0;
  57.  
  58. void kiir()
  59. {
  60.     printf("Solution #%d\n", ++megoldasok);
  61.     for (int y=0; y<8; y++) {
  62.         for (int x=0; x<8; x++) {
  63.             int n = tabla[POS(x,y)];
  64.             if (n)
  65.                 printf(" %02d", n);
  66.             else
  67.                 printf(" --");
  68.         }
  69.         printf("\n");
  70.     }
  71.     printf("\n");
  72. }
  73.  
  74. void kovlep(int pos, int xy, char n)
  75. {
  76.     int ujpos = pos + xy;
  77.     if (tabla[ujpos]) {
  78.         if (n == UTLEPES+1 && tabla[ujpos] == 1)
  79.             kiir();
  80.         return;             // backtrack
  81.     }
  82.     tabla[ujpos] = n;
  83.     if (printall && n == UTLEPES) {
  84.         kiir();
  85.     } else {
  86.         for (int i=0; i<8; i++)
  87.             kovlep(ujpos, lep[i], n+1);
  88.     }
  89.     tabla[ujpos] = 0;
  90. }
  91.  
  92. int main()
  93. {
  94.     memset(tabla, 0, sizeof(tabla));
  95.     memset(tabla, -1, s_y1);
  96.     for (int y=0; y<8; y++)
  97.         for (int x=8; x<=10; x++)
  98.             tabla[POS(x,y)] = -1;
  99.     memset(tabla+POS(0,8), -1, s_y2);
  100.  
  101.     kovlep(KEZD, 0, 1);
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement