Advertisement
Guest User

UI zadanie 2

a guest
Mar 28th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.90 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <stdbool.h>
  4. #include <time.h>
  5.  
  6. int pocetKrokov = 0;
  7.  
  8.  
  9. /*naplnenie tabulky heuristickou funkciou, ktorej hodnoty predstavuju pocet pohybov konom ktoré sa daju urobit z daneho policka*/
  10. void napln(int **heuristika, int velkost)  
  11. {                              
  12.     int i, j;
  13.     for (i = 0; i < velkost; i++)
  14.     {
  15.         for (j = 0; j < velkost; j++)
  16.         {
  17.             if (i == 0 || j == 0 || i == velkost - 1 || j == velkost - 1)
  18.             {
  19.                 heuristika[i][j] = 4;
  20.             }
  21.             else
  22.             {
  23.                 if (i == 1 || j == 1 || i == velkost - 2 || j == velkost - 2)
  24.                 {
  25.                     heuristika[i][j] = 6;
  26.                 }
  27.                 else
  28.                 {
  29.                     heuristika[i][j] = 8;
  30.                 }
  31.             }
  32.  
  33.         }
  34.     }
  35.     heuristika[0][0] = 2;
  36.     heuristika[0][velkost - 1] = 2;
  37.     heuristika[velkost - 1][0] = 2;
  38.     heuristika[velkost - 1][velkost - 1] = 2;
  39.  
  40.     heuristika[0][1] = 3;
  41.     heuristika[1][0] = 3;
  42.     heuristika[0][velkost - 2] = 3;
  43.     heuristika[1][velkost - 1] = 3;
  44.     heuristika[velkost - 2][0] = 3;
  45.     heuristika[velkost - 1][1] = 3;
  46.     heuristika[velkost - 1][velkost - 2] = 3;
  47.     heuristika[velkost - 2][velkost - 1] = 3;
  48.  
  49.     heuristika[1][1] = 4;
  50.     heuristika[velkost - 2][1] = 4;
  51.     heuristika[1][velkost - 2] = 4;
  52.     heuristika[velkost - 2][velkost - 2] = 4;
  53. }
  54. int eulerovKon(int x, int y, int movei, int **riesenie, int xPosun[8], int yPosun[8], int **heuristika,int velkost);
  55.  
  56. /*funkcia ktora vrati ci je pohyb dovoleny, alebo nie (ci nepojde mimo sachovnice, alebo ci nepojde na policko na ktorom uz bol)*/
  57. bool safe(int x, int y, int **riesenie,int velkost)
  58. {
  59.     return (x >= 0 && x < velkost && y >= 0 && y < velkost && riesenie[x][y] == -1);
  60. }
  61.  
  62.  
  63. /*vytvorenie a naplnenie tabuliek potrebných na prehladanie sachovnice + zavolanie funkcie*/
  64. bool priprava(int zaciatok_x, int zaciatok_y,int velkost)
  65. {
  66.     int **riesenie, **heuristika, x, y,i,j;
  67.     heuristika = (int**)malloc(sizeof(int*)*velkost);
  68.     riesenie = (int**)malloc(sizeof(int*)*velkost);
  69.     for (i = 0; i < velkost; i++)
  70.     {
  71.         heuristika[i] = (int*)malloc(sizeof(int)*velkost);
  72.         riesenie[i] = (int*)malloc(sizeof(int)*velkost);
  73.         for (j = 0; j < velkost; j++)
  74.         {
  75.             riesenie[i][j] = -1;
  76.         }
  77.     }
  78.     napln(heuristika, velkost);
  79.                    
  80.  
  81.     int xPosun[8] = { 2, 1, -1, -2, -2, -1, 1, 2 }; //posuny na sachovnici v smere x, nasiel som na internete ze tato postupnost krokov vedie v priemere k najrychlejsiemu rieseniu
  82.     int yPosun[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
  83.  
  84.  
  85.     riesenie[zaciatok_x][zaciatok_y] = 0; //zapisanie prvej pozicie do tabulky riesenia
  86.  
  87.  
  88.     if (eulerovKon(zaciatok_x, zaciatok_y, 1, riesenie, xPosun, yPosun, heuristika,velkost) == false) //volanie rekurzivnej funkcie na riesenie problemu eulerovho kona
  89.     {
  90.         if (pocetKrokov < 2000000){
  91.             printf("Solution does not exist\n");
  92.             return false;
  93.         }
  94.         else
  95.         {
  96.             printf("program prekrocil maximalne mnozstvo krokov(2 000 000)\n"); //obmedzenie poctu krokov na 2 000 000
  97.             pocetKrokov = 0;
  98.             return false;
  99.         }
  100.     }
  101.     else
  102.    
  103.     /*vypis riesenia*/
  104.     for (i = 0; i < velkost; i++)
  105.     {
  106.         for (j = 0; j < velkost; j++)
  107.             printf(" %2d ", riesenie[i][j]);
  108.         printf("\n");
  109.     }
  110.     printf("\n");
  111.  
  112.     return true;
  113. }
  114. /*rekurzivna funkcia riesiaca problem eulerovho kona*/
  115. int eulerovKon(int x, int y, int movei, int **riesenie, int xPosun[8], int yPosun[8], int **heuristika,int velkost) {
  116.     int k, i, j, pom, next_x, next_y, poradie[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
  117.     if (movei == velkost * velkost) //velkost hlbky ktoru chceme dosiahnut
  118.         return true;
  119.  
  120.     /*bubble sort na zoradenie heuristiky*/
  121.     for (i = 0; i < 8; i++) {
  122.         for (j = 0; j < 7; j++) {
  123.             if (safe(x + xPosun[poradie[j]], y + yPosun[poradie[j]], riesenie,velkost) &&
  124.                 safe(x + xPosun[poradie[j + 1]], y + yPosun[poradie[j + 1]], riesenie,velkost)) {
  125.                 if (heuristika[x + xPosun[poradie[j]]][y + yPosun[poradie[j]]] >
  126.                     heuristika[x + xPosun[poradie[j + 1]]][y + yPosun[poradie[j + 1]]]) {
  127.  
  128.                     pom = poradie[j];
  129.                     poradie[j] = poradie[j + 1];
  130.                     poradie[j + 1] = pom;
  131.                 }
  132.             }
  133.             else {
  134.                 if (!safe(x + xPosun[poradie[j]], y + yPosun[poradie[j]], riesenie,velkost) &&
  135.                     safe(x + xPosun[poradie[j + 1]], y + yPosun[poradie[j + 1]], riesenie,velkost)) {
  136.                     pom = poradie[j];
  137.                     poradie[j] = poradie[j + 1];
  138.                     poradie[j + 1] = pom;
  139.                 }
  140.             }
  141.         }
  142.     }
  143.     /*zanáranie do krokov od tych s najmensim cislom heurisiky az po tie s najvacsim*/
  144.     for (k = 0; k < 8; k++) {
  145.         next_x = x + xPosun[poradie[k]];
  146.         next_y = y + yPosun[poradie[k]];
  147.         if (safe(next_x, next_y, riesenie,velkost)) {
  148.             for (i = 0; i < 8; i++) {                       //odčítanie jednotky od okolitych pozicii v heuristike. kedze vybereme poziciu, tak z ostatnych z ktorych sa na nu dalo stupit vieme stupit o jeden menej  
  149.                 if (safe(x + xPosun[i], y + yPosun[i], riesenie,velkost)) {
  150.                     heuristika[x + xPosun[i]][y + yPosun[i]] -= 1;
  151.                 }
  152.             }
  153.             if (pocetKrokov<2000000)                    //obmedzenie na pocet krokov kolko moze funkcia vykonat
  154.                 {
  155.                     pocetKrokov++;
  156.                 }
  157.             else
  158.             {
  159.                 return false;
  160.             }
  161.             riesenie[next_x][next_y] = movei;
  162.             if (eulerovKon(next_x, next_y, movei + 1, riesenie, xPosun, yPosun, heuristika, velkost) == true){ //ked sa da riesit dalej, tak sa vnor o jednu hlbku dalej
  163.                 return true;
  164.             }
  165.             else {          //ked sa neda postupovat dalej, tak do tabulky s riesenim zapis -1 ako pozicia na ktorej kon nebol a vyber dalsi krok
  166.                 riesenie[next_x][next_y] = -1;
  167.                 for (i = 0; i < 8; i++) {
  168.                     if (safe(x + xPosun[i], y + yPosun[i], riesenie,velkost)) {
  169.                         heuristika[x + xPosun[i]][y + yPosun[i]] += 1;              //pripocitanie k heuristike, kedze sa vraciame z bodov na ktorych sme stali
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.     }
  175.  
  176.     return false;
  177. }
  178.  
  179. int main()
  180. {
  181.     int  i,velkost,x,y;
  182.    
  183.     printf("Zadajte veLkost strany Sachovnice:\n");
  184.     scanf("%d", &velkost);
  185.     srand(time(NULL));
  186.     for ( i = 0; i < 10; i++)
  187.     {
  188.        
  189.         x = rand() % velkost;
  190.         y = rand() % velkost;
  191.         printf("Riesenie:%d\n",i+1);
  192.         printf("Pozicia X:%d Y:%d\n", x,y);
  193.         priprava(y, x, velkost);
  194.     }
  195.     system("PAUSE");
  196.     return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement