Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.76 KB | None | 0 0
  1. //AUTOR: PRZEMYSŁAW SAŁĘGA
  2. //konfiguracja końcowa:
  3. //1, 4, 7
  4. //2, 5, 8
  5. //3, 6
  6.  
  7. #include <iostream>
  8. #include <ctime>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. struct element {
  14.     char wartosc;
  15.     int index_i;
  16.     int index_j;
  17.     element() {};
  18.     element(char wartosc, int index_i, int index_j) {
  19.         this->index_i = index_i;
  20.         this->index_j = index_j;
  21.         this->wartosc = wartosc;
  22.     }
  23. };
  24.  
  25. class puzzle {
  26.     char tab[3][3];
  27. public:
  28.     void wypelnij_losowo();
  29.     void wypelnij();
  30.     void wypisz_tab();
  31.     int total_manhattan_distance();
  32.     bool ruch();
  33. };
  34.  
  35. int puzzle::total_manhattan_distance() {
  36.     int suma = 0;
  37.     int j = 0;
  38.     for (int i = 0; i < 3; i++) {
  39.         for (j = 0; j < 3; j++) {
  40.             if (tab[i][j] == ' ') {
  41.                 continue;
  42.             }
  43.             int i_koncowe;
  44.             int j_koncowe;
  45.             if (tab[i][j] == '1') {
  46.                 i_koncowe = 0;
  47.                 j_koncowe = 0;
  48.             }
  49.             else if (tab[i][j] == '2') {
  50.                 i_koncowe = 1;
  51.                 j_koncowe = 0;
  52.             }
  53.             else if (tab[i][j] == '3') {
  54.                 i_koncowe = 2;
  55.                 j_koncowe = 0;
  56.             }
  57.             else if (tab[i][j] == '4') {
  58.                 i_koncowe = 0;
  59.                 j_koncowe = 1;
  60.             }
  61.             else if (tab[i][j] == '5') {
  62.                 i_koncowe = 1;
  63.                 j_koncowe = 1;
  64.             }
  65.             else if (tab[i][j] == '6') {
  66.                 i_koncowe = 2;
  67.                 j_koncowe = 1;
  68.             }
  69.             else if (tab[i][j] == '7') {
  70.                 i_koncowe = 0;
  71.                 j_koncowe = 2;
  72.             }
  73.             else if (tab[i][j] == '8') {
  74.                 i_koncowe = 1;
  75.                 j_koncowe = 2;
  76.             }
  77.             suma += abs(i_koncowe - i);
  78.             suma += abs(j_koncowe - j);
  79.         }
  80.     }
  81.     return suma;
  82. }
  83.  
  84. void puzzle::wypelnij_losowo() {
  85.     char wykorzystane[9];
  86.     int l_wykorzystanych = 0;
  87.     int j = 0;
  88.     for (int i = 0; i < 3; i++) {
  89.         for (j = 0; j < 3; j++) {
  90.             bool jeszcze_raz = false;
  91.             do {
  92.                 jeszcze_raz = false;
  93.                 tab[i][j] = (rand() % 9) + 49;
  94.                 if (tab[i][j] == '9') {
  95.                     tab[i][j] = ' ';
  96.                 }
  97.                 for (int k = 0; k < l_wykorzystanych; k++) {
  98.                     if (wykorzystane[k] == tab[i][j]) {
  99.                         jeszcze_raz = true;
  100.                         break;
  101.                     }
  102.                 }
  103.                 if (jeszcze_raz == false) {
  104.                     wykorzystane[l_wykorzystanych] = tab[i][j];
  105.                     l_wykorzystanych++;
  106.                 }
  107.             } while (jeszcze_raz == true);
  108.         }
  109.     }
  110. }
  111.  
  112. void puzzle::wypelnij() {
  113.     int j;
  114.     for (int i = 0; i < 3; i++) {
  115.         for (j = 0; j < 3; j++) {
  116.             cout << "Podaj wartosc dla [" << i << "][" << j << "](Wpisz 9, aby ustawic wolne pole): ";
  117.             cin >> tab[i][j];
  118.             if (tab[i][j] == '9') {
  119.                 tab[i][j] = ' ';
  120.             }
  121.         }
  122.     }
  123. }
  124.  
  125. void puzzle::wypisz_tab() {
  126.     int j = 0;
  127.     for (int i = 0; i < 3; i++) {
  128.         for (j = 0; j < 3; j++) {
  129.             cout << tab[i][j] << " ";
  130.         }
  131.         cout << endl;
  132.     }
  133. }
  134.  
  135. bool puzzle::ruch() {
  136.     int i, j;               //indeksy pustego pola na planszy
  137.     vector<element> lista;
  138.     for (i = 0; i < 3; i++) {
  139.         for (j = 0; j < 3; j++) {
  140.             if (tab[i][j] == ' ') {
  141.                 break;
  142.             }
  143.         }
  144.         if (i != 3 && j != 3) {
  145.             if (tab[i][j] == ' ') {
  146.                 break;
  147.             }
  148.         }
  149.     }
  150.     if (j != 0) {
  151.         element e(tab[i][j-1], i, j - 1);
  152.         lista.push_back(e);
  153.     }
  154.     if (j != 2) {
  155.         element e(tab[i][j+1], i, j + 1);
  156.         lista.push_back(e);
  157.     }
  158.     if (i != 0) {
  159.         element e(tab[i-1][j], i - 1, j);
  160.         lista.push_back(e);
  161.     }
  162.     if (i != 2) {
  163.         element e(tab[i+1][j], i + 1, j);
  164.         lista.push_back(e);
  165.     }
  166.     int stara_suma = total_manhattan_distance();
  167.     int i_tmp, j_tmp;
  168.     int licznik = 0;
  169.     vector<int> sumy;
  170.     do {    //sprawdzanie sum odległości
  171.         //zamiana na nowy element
  172.         cout << endl << "Sprawdzenie " << licznik + 1 << ". sasiada." << endl;
  173.         i_tmp = i;
  174.         j_tmp = j;
  175.         i = lista[licznik].index_i;
  176.         j = lista[licznik].index_j;
  177.         tab[i][j] = ' ';
  178.         tab[i_tmp][j_tmp] = lista[licznik].wartosc;
  179.         cout << "Tablica: " << endl;
  180.         wypisz_tab();
  181.         cout << "Suma odleglosci: ";
  182.         cout << total_manhattan_distance() << endl;
  183.         sumy.push_back(total_manhattan_distance()); //zapisanie nowej sumy
  184.         //powrót do poprzedniego stanu
  185.         tab[i][j] = lista[licznik].wartosc;
  186.         tab[i_tmp][j_tmp] = ' ';
  187.         i = i_tmp;
  188.         j = j_tmp;
  189.         licznik++;
  190.     } while (licznik != lista.size());
  191.     //sprawdzanie najmniejszej sumy odległości ze wszystkich możliwych
  192.     int min_indeks = 0; //indeks najmniejszej sumy w wektorze
  193.     int min = sumy[min_indeks]; //najmniejsza suma
  194.     int k; 
  195.     for (k = 1; k < sumy.size(); k++) {
  196.         if (sumy[k] < min) {
  197.             min = sumy[k];
  198.             min_indeks = k;
  199.         }
  200.     }
  201.     //zamiana z "sąsiadem", który da najmniejszą sumę odległości
  202.     if (min <= total_manhattan_distance()) {
  203.         cout << "Zamiana z " << min_indeks + 1 << ". sasiadem." << endl << endl;
  204.         i_tmp = i;
  205.         j_tmp = j;
  206.         i = lista[min_indeks].index_i;
  207.         j = lista[min_indeks].index_j;
  208.         tab[i][j] = ' ';
  209.         tab[i_tmp][j_tmp] = lista[min_indeks].wartosc;
  210.         cout << "Tablica: " << endl;
  211.         wypisz_tab();
  212.         cout << "Suma odleglosci: ";
  213.         cout << total_manhattan_distance() << endl;
  214.         if (total_manhattan_distance() == 0) {
  215.             cout << "Koniec!" << endl;
  216.             return false;
  217.         }
  218.         return true;
  219.     }
  220.     cout << "Blokada w minimum lokalnym." << endl;
  221.     return false;
  222. }
  223.  
  224. int main() {
  225.     srand((unsigned int)time(NULL));
  226.     int kolejna_proba = 1;
  227.     do {
  228.         puzzle p;
  229.         int wybor;
  230.         cout << "[1] Wypelnij losowo" << endl;
  231.         cout << "[2] Wypelnij z klawiatury" << endl;
  232.         cout << "[3] O programie" << endl;
  233.         cout << "[0] Wyjdz." << endl;
  234.         cin >> wybor;
  235.         switch (wybor) {
  236.         case 1:
  237.             p.wypelnij_losowo();
  238.             break;
  239.         case 2:
  240.             p.wypelnij();
  241.             break;
  242.         case 3:
  243.             cout << "Autor programu: Przemyslaw Salega." << endl;
  244.             system("PAUSE");
  245.             system("cls");
  246.             continue;
  247.         case 0:
  248.             system("PAUSE");
  249.             return 0;
  250.         }
  251.         cout << "Tablica: " << endl;
  252.         p.wypisz_tab();
  253.         cout << "Suma odleglosci: ";
  254.         cout << p.total_manhattan_distance() << endl;
  255.         bool czy_kontynuowac = true;
  256.         do {
  257.             czy_kontynuowac = p.ruch();
  258.         } while (czy_kontynuowac == true);
  259.         cout << "Jeszcze raz? [1] Tak, [Dow. liczba] Nie: ";
  260.         cin >> kolejna_proba;
  261.         system("cls");
  262.     } while (kolejna_proba == 1);
  263.     system("PAUSE");
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement