Advertisement
matbiz01

Finished rectangle fit

Jun 16th, 2023
1,182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include "math.h"
  5. class Size {
  6. public:
  7.     int x;
  8.     int y;
  9.     Size(int x, int y): x(x), y(y){}
  10.     int getArea(){
  11.         return x * y;
  12.     }
  13. };
  14.  
  15. namespace sf {
  16.     class Vector2i {
  17.     public:
  18.         int x;
  19.         int y;
  20.         Vector2i(int x, int y) : x(x), y(y){}
  21.     };
  22.    
  23. };
  24.  
  25. void print(std::vector<Size> sizes){
  26.     std::cout << "printing" << std::endl;
  27.     for(auto size: sizes){
  28.         std::cout << "x: " << size.x << ", y: " << size.y << std::endl;
  29.     }
  30. }
  31.  
  32. void printOccupied(std::vector<std::vector<bool>> occupied){
  33.     for(auto line: occupied){
  34.         std::string row;
  35.         for(auto val: line){
  36.             row += std::to_string(val) + " ";
  37.         }
  38.         std::cout << row << std::endl;
  39.     }
  40. }
  41.  
  42. bool fits(int x, int y, Size size, std::vector<std::vector<bool>> occupied){
  43.     try{
  44.         for(int i = x; i < x + size.x; i++){
  45.             for(int j = y; j < y + size.y; j++){
  46.                 if(occupied.at(j).at(i)) return false;
  47.             }
  48.         }
  49.     }
  50.     catch (const std::out_of_range& e) {
  51.         return false;
  52.     }
  53.     return true;
  54. }
  55.  
  56. int main()
  57. {
  58.     std::vector<Size> sizes;
  59.     for(int i = 2; i < 7; i += 4){
  60.         for(int j = 1; j < 8; j += 4){
  61.             sizes.push_back(Size(i, j));
  62.         }
  63.     }
  64.    
  65.     for(int i = 0; i < 15; i++){
  66.         sizes.push_back(Size(1, 1));
  67.     }
  68.  
  69.    
  70.     std::sort(sizes.begin(), sizes.end(),
  71.         [](const Size &a, const Size &b){
  72.             return a.x * a.y > b.x * b.y;
  73.         }
  74.     );
  75.    
  76.     int area = 0;
  77.     for(auto size: sizes){
  78.         area += size.x * size.y;
  79.     }
  80.    
  81.    
  82.     int width = (int)(std::sqrt(area) * 1.3);
  83.     int height = width;
  84.     printf("area: %d\n", area);
  85.     printf("width: %d, height: %d\n", width, height);
  86.     std::vector<std::vector<bool>> occupied = std::vector<std::vector<bool>>(height, std::vector<bool>(width, false));
  87.     for(auto size: sizes){
  88.         printf("size x: %d, y: %d\n", size.x, size.y);
  89.         printOccupied(occupied);
  90.         bool fit = false;
  91.         for(int i = 0; i < height; i++){
  92.             for(int j = 0; j < width; j++){
  93.                 if(fits(j, i, size, occupied)){
  94.                    
  95.                     for(int k = i; k < i + size.y; k++){
  96.                         for(int l = j; l < j + size.x; l++){
  97.                             printf("%d %d\n", k,l);
  98.                             occupied.at(k).at(l) = true;
  99.                         }
  100.                     }
  101.                     fit = true;
  102.                     break;
  103.                 }
  104.             }
  105.             if(fit) break;
  106.         }
  107.     }
  108.    
  109.     return 0;
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement