Advertisement
35657

Untitled

Jun 16th, 2024
630
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int field_size, max_count, cnt = 0, result = 0;
  6. int* row; // массив номеров строк
  7. int* col; // массив номеров столбцов
  8. int* main_diag; // массив номеров диагоналей, параллельных главной
  9. int* side_diag; // массив номеров диагоналей, параллельных побочной
  10.  
  11. int** arr; // этот массив нужен только для визуализации, если не надо - можно не заполнять его
  12.  
  13. void print(int** arr) {
  14.     for (int i = 0; i < field_size; ++i) {
  15.         for (int j = 0; j < field_size; j++) {
  16.             cout << arr[i][j] << " ";
  17.         }
  18.         cout << endl;
  19.     }
  20.     cout << endl;
  21. }
  22.  
  23. void get_count(int i = 0, int k = 0) { // i - номер строки
  24.     for (int j = k; j < field_size; ++j) { // j - номер столбца
  25.         if (col[j] < 2 && row[i] < 2 && main_diag[i + j] < 2 && side_diag[field_size - i + j] < 2) {
  26.             if (cnt == max_count - 1) {
  27.                 result++;
  28.                 // строки 29-31 только для визуализации, если не надо - закомментировать
  29.                 arr[i][j]++;
  30.                 print(arr);
  31.                 arr[i][j]--;
  32.                 return;
  33.             }
  34.             else {
  35.                 row[i]++;
  36.                 col[j]++;
  37.                 main_diag[i + j]++;
  38.                 side_diag[field_size - i + j]++;
  39.                 arr[i][j]++; // только для визуализации
  40.                 cnt++;
  41.  
  42.                 row[i] == 2 ? get_count(i + 1, 0) : get_count(i, j + 1);
  43.  
  44.                 row[i]--;
  45.                 col[j]--;
  46.                 main_diag[i + j]--;
  47.                 side_diag[field_size - i + j]--;
  48.                 arr[i][j]--; // только для визуализации
  49.                 cnt--;
  50.             }
  51.         }
  52.     }
  53. }
  54.  
  55. int main() {
  56.  
  57.     setlocale(LC_ALL, "ru");
  58.  
  59.     cout << "Введите размер поля: ";
  60.  
  61.     cin >> field_size;
  62.  
  63.  
  64.     // этот массив нужен только для визуализации, если не надо - можно не заполнять его
  65.     arr = new int* [field_size];
  66.  
  67.     for (int i = 0; i < field_size; ++i) {
  68.         arr[i] = new int[field_size] {};
  69.     }
  70.  
  71.     max_count = field_size * 2;
  72.  
  73.     row = new int[field_size] {};
  74.  
  75.     col = new int[field_size] {};
  76.  
  77.     main_diag = new int[field_size * 2] {};
  78.  
  79.     side_diag = new int[field_size * 2] {};
  80.  
  81.     get_count();
  82.     cout << endl << "Количество расстановок: " << result << endl;
  83.  
  84.     for (int i = 0; i < field_size; ++i) {
  85.         delete[] arr[i];
  86.     }
  87.  
  88.     delete[] arr, row, col, main_diag, side_diag;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement