Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stack>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. struct trio{
  9. int x;
  10. int y;
  11. int size;
  12. };
  13.  
  14. struct figure {
  15. int** rectangle;
  16. int delivered;
  17. int N, M;
  18. int minCount;
  19. stack <trio> coordinates;
  20. } figure;
  21.  
  22. stack<pair<int, bool>> size_square;
  23.  
  24.  
  25. void max_insert(int x, int y)
  26. {
  27. int size;
  28. for (size = 1; size <= figure.N - 1; size++)
  29. {
  30. if (y + size > figure.N)
  31. return;
  32.  
  33. if (x + size > figure.M)
  34. return;
  35.  
  36. for (int i = y; i < y + size; i++)
  37. for (int j = x; j < x + size; j++)
  38. {
  39. if (figure.rectangle[i][j] != 0)
  40. return;
  41. }
  42. size_square.push(make_pair(size, false));
  43. }
  44. }
  45.  
  46.  
  47. void clear(trio a)
  48. {
  49. figure.delivered -= a.size * a.size;
  50.  
  51. for (int i = a.y; i < a.y + a.size; i++)
  52. for (int j = a.x; j < a.x + a.size; j++)
  53. figure.rectangle[i][j] = 0;
  54. }
  55.  
  56.  
  57. void insert(int x, int y, int size, int color)
  58. {
  59. figure.delivered += size * size;
  60.  
  61. for (int i = y; i < y + size; i++)
  62. for (int j = x; j < x + size; j++)
  63. figure.rectangle[i][j] = color;
  64. }
  65.  
  66.  
  67. void print(){
  68. for (int i = 0; i < figure.N; i++) {
  69. for (int j = 0; j < figure.M; j++) {
  70. cout << figure.rectangle[i][j] << ' ';
  71. }
  72. cout << endl;
  73. }
  74. cout << endl;
  75. getchar();
  76. }
  77.  
  78.  
  79. int tiling(int try_insert)
  80. {
  81. int x = 0, y = 0;
  82. int color = 1;
  83. int counter = 1;
  84. bool flag;
  85.  
  86. max_insert(x, y);
  87. insert(x, y, size_square.top().first, color);
  88. size_square.top().second = true;
  89.  
  90. figure.coordinates.push(trio{x, y, size_square.top().first});
  91. color++;
  92.  
  93.  
  94. while (!size_square.empty())
  95. {
  96. size_square.top().second = true;
  97.  
  98.  
  99. flag = false;
  100. for (y = 0; y < figure.N; y++) {
  101. for (x = 0; x < figure.M; x++)
  102. {
  103. if (figure.rectangle[y][x] == 0)
  104. {
  105. flag = true;
  106. max_insert(x, y);
  107. insert(x, y, size_square.top().first, color);
  108. figure.coordinates.push(trio{x, y, size_square.top().first});
  109. counter++;
  110. color++;
  111. // cout << "Insert (" << figure.minCount << ')' << endl;
  112. // print();
  113. break;
  114. }
  115. }
  116. if (flag)
  117. break;
  118. }
  119. if (figure.delivered == figure.N * figure.M || counter >= figure.minCount)
  120. {
  121. if (counter < figure.minCount){
  122. figure.minCount = counter;
  123. }
  124. //recovery
  125. }
  126. while (!size_square.empty() && size_square.top().second)
  127. {
  128. size_square.pop();
  129. clear(figure.coordinates.top());
  130. figure.coordinates.pop();
  131. if (!size_square.empty() && !size_square.top().second){
  132. bool ps = false;
  133. for (y = 0; y < figure.N && !ps; y++)
  134. for (x = 0; x < figure.M && !ps; x++)
  135. if (figure.rectangle[y][x] == 0)
  136. {
  137. ps = true;
  138. figure.coordinates.push(trio{x, y, size_square.top().first});
  139. insert(x, y, size_square.top().first, color);
  140. counter = figure.coordinates.size();
  141. }
  142. }
  143. color++;
  144. }
  145. }
  146.  
  147. return figure.minCount;
  148. }
  149.  
  150.  
  151. int main() {
  152. int try_insert = 4;
  153. int flag = true;
  154. cin >> figure.N >> figure.M;
  155.  
  156. if (figure.N > figure.M)
  157. {
  158. swap(figure.N, figure.M);
  159. }
  160.  
  161. figure.rectangle = new int*[figure.N];
  162. figure.minCount = figure.M*figure.N+1;
  163. for (int i = 0; i < figure.N; i++)
  164. {
  165. figure.rectangle[i] = new int[figure.M];
  166. }
  167.  
  168. for (int i = 0; i < figure.N; i++)
  169. for (int j = 0; j < figure.M; j++)
  170. figure.rectangle[i][j] = 0;
  171.  
  172. // while (flag)
  173. // {
  174. // flag = tiling(try_insert);
  175. // try_insert++;
  176. // }
  177. cout << tiling(try_insert) << endl;
  178.  
  179. // print();
  180.  
  181. return 0;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement