polygraph

Рекурсивный алгоритм решения задачи 8 ферзей

Apr 22nd, 2021
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. // Backtracking method. "Поиск с возвратом" на примере
  2. // задачи о восьми ферзях.
  3.  
  4. #include <iostream>
  5.  
  6. const int SIZE = 8; // Размер.
  7.  
  8. int board[SIZE][SIZE];
  9. int results_count = 0; // Количество решений.
  10.  
  11. // Функция showBoard() - отображает доску.
  12. void showBoard()
  13. {
  14.     for(int a = 0; a < SIZE; ++a)
  15.     {
  16.         for(int b = 0; b < SIZE; ++b)
  17.         {
  18.             std::cout << ((board[a][b]) ? "Q " : ". ");
  19.         }
  20.         std::cout << '\n';
  21.     }
  22. }
  23.  
  24. // Функция tryQueen() - проверяет нет ли уже установленных ферзей,
  25. // по вертикали, диагоналям.
  26. bool tryQueen(int a, int b)
  27. {
  28.     for(int i = 0; i < a; ++i)
  29.     {
  30.         if(board[i][b])
  31.         {
  32.             return false;
  33.         }
  34.     }
  35.  
  36.     for(int i = 1; i <= a && b-i >= 0; ++i)
  37.     {
  38.         if(board[a-i][b-i])
  39.         {
  40.             return false;
  41.         }
  42.     }
  43.  
  44.     for(int i = 1; i <= a && b+i < SIZE; i++)
  45.     {
  46.         if(board[a-i][b+i])
  47.         {
  48.             return false;
  49.         }
  50.     }
  51.  
  52.     return true;
  53. }
  54.  
  55. // Функция setQueen() - пробует найти результаты решений.
  56. void setQueen(int a) // a - номер очередной строки в которую нужно поставить очередного ферзя.
  57. {
  58.     if(a == SIZE)
  59.     {
  60.         showBoard();
  61.         std::cout << "Result #" << ++results_count << "\n\n";
  62.         return; // Опционально.
  63.     }
  64.  
  65.     for(int i = 0; i < SIZE; ++i)
  66.     {
  67.         // Здесь проверяем, что если поставим в board[a][i] ферзя (единицу),
  68.         // то он будет единственным в этой строке, столбце и диагоналях.
  69.         if(tryQueen(a, i))
  70.         {
  71.             board[a][i] = 1;
  72.             setQueen(a+1);
  73.             board[a][i] = 0;
  74.         }
  75.     }
  76.  
  77.     return; // Опционально.
  78. }
  79.  
  80. int main()
  81. {
  82.     setQueen(0);
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment