Advertisement
maxim_shlyahtin

SquaringSquares

May 31st, 2024 (edited)
525
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. // Класс для представления квадрата
  7. class Square {
  8. public:
  9.     int x, y, size;
  10.     Square(int x, int y, int size) : x(x), y(y), size(size) {}
  11. };
  12.  
  13. // Глобальные переменные
  14. int n;
  15. int min_squares;
  16. vector<Square> best_solution;
  17. vector<int> required_squares; // список размеров обязательных квадратов
  18.  
  19. // Функция для проверки, занято ли место на доске
  20. bool is_taken(const vector<Square>& table, int x, int y) {
  21.     for (const auto& square : table) {
  22.         if (square.x <= x && x < square.x + square.size && square.y <= y && y < square.y + square.size) {
  23.             return true;
  24.         }
  25.     }
  26.     return false;
  27. }
  28.  
  29. // Функция для выполнения бэктрекинга
  30. void solve(vector<Square> table, int current_area, int square_count, int min_x, int min_y) {
  31.     for (int x = min_x; x < n; ++x) {
  32.         for (int y = min_y; y < n; ++y) {
  33.             if (!is_taken(table, x, y)) {
  34.                 int limit = min(n - x, n - y);
  35.                 for (const auto& square : table) {
  36.                     if (square.x + square.size > x && square.y > y) {
  37.                         limit = min(limit, square.y - y);
  38.                     }
  39.                 }
  40.                 for (int size = limit; size > 0; --size) {
  41.                     Square square(x, y, size);
  42.                     vector<Square> currTable = table;
  43.                     currTable.push_back(square);
  44.                     if (current_area + size * size == n * n) {
  45.                         if (square_count + 1 < min_squares) {
  46.                             min_squares = square_count + 1;
  47.                             best_solution = currTable;
  48.                         }
  49.                     }
  50.                     else if (square_count + 1 < min_squares) {
  51.                         solve(currTable, current_area + size * size, square_count + 1, x, y + size);
  52.                     }
  53.                 }
  54.                 return;
  55.             }
  56.         }
  57.         min_y = 0;
  58.     }
  59. }
  60.  
  61. int main() {
  62.     // Ввод размера доски
  63.     cin >> n;
  64.  
  65.     int m;
  66.     // Ввод количества обязательных квадратов
  67.     cin >> m;
  68.     required_squares.resize(m);
  69.  
  70.     // Ввод обязательных квадратов
  71.     for (int i = 0; i < m; ++i) {
  72.         cin >> required_squares[i];
  73.     }
  74.  
  75.     if (n % 2 != 0) {
  76.         // Если размер нечетный, выполняем бэктрекинг для нахождения лучшего покрытия
  77.         min_squares = 2 * n + 1; // максимально возможное количество квадратов
  78.         best_solution.clear();
  79.         int size_of_table = 1;
  80.  
  81.         // Поиск наибольшего делителя
  82.         for (int i = 2; i < n; ++i) {
  83.             if (n % i == 0) {
  84.                 size_of_table = i;
  85.             }
  86.         }
  87.         n /= size_of_table;
  88.  
  89.         // Начальное состояние таблицы с обязательными квадратами
  90.         vector<Square> startTable;
  91.         int current_area = 0;
  92.  
  93.         for (int size : required_squares) {
  94.             Square sq(0, 0, size);
  95.             startTable.push_back(sq);
  96.             current_area += size * size;
  97.         }
  98.  
  99.         // Добавление начальных квадратов, если площадь не заполнена обязательными квадратами
  100.         if (current_area < n * n) {
  101.             int extra_squares = (n * n - current_area) / ((n + 1) / 2 * (n + 1) / 2);
  102.             for (int i = 0; i < extra_squares; ++i) {
  103.                 startTable.push_back(Square(0, 0, (n + 1) / 2));
  104.             }
  105.         }
  106.  
  107.         // Запуск бэктрекинга
  108.         solve(startTable, current_area, startTable.size(), 0, 0);
  109.  
  110.         // Вывод результата
  111.         cout << best_solution.size() << endl;
  112.         for (const auto& square : best_solution) {
  113.             cout << square.x * size_of_table << " " << square.y * size_of_table << " " << square.size * size_of_table << endl;
  114.         }
  115.     } else {
  116.         // Если размер четный, выводим фиксированное покрытие
  117.         cout << 4 << endl;
  118.         cout << 0 << " " << 0 << " " << n / 2 << endl;
  119.         cout << 0 << " " << n / 2 << " " << n / 2 << endl;
  120.         cout << n / 2 << " " << 0 << " " << n / 2 << endl;
  121.         cout << n / 2 << " " << n / 2 << " " << n / 2 << endl;
  122.     }
  123.  
  124.     return 0;
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement