Advertisement
Hinski2

Untitled

Jun 15th, 2024
11
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <sys/resource.h>
  3. using namespace std;
  4.  
  5. #define fi first
  6. #define se second
  7.  
  8. typedef pair<int, int> pii;
  9. const int mak = 70;
  10. const int target = 840;
  11.  
  12. pii setup[25];
  13. int score;
  14.  
  15. void print_ans(){
  16. cout << score << endl;
  17. int cnt = 0;
  18. for(int i = 1; i < 25; i++){
  19. if(setup[i] != make_pair(-1, -1)){
  20. cnt += i * i;
  21. cout << 1;
  22. }
  23. else
  24. cout << 0;
  25. }
  26. cout << endl << 70 * 70 - cnt << endl;
  27.  
  28. char board[mak][mak];
  29. for(int i = 0; i < mak; i++)
  30. for(int j = 0; j < mak; j++)
  31. board[i][j] = '.';
  32.  
  33. for(int i = 1; i < 25; i++){
  34. if(setup[i] == make_pair(-1, -1)) continue;
  35. for(int x = setup[i].first; x < setup[i].first + i; x++)
  36. for(int y = setup[i].second; y < setup[i].second + i; y++)
  37. board[x][y] = 'A' -1 + i;
  38. }
  39.  
  40. for(int i = 0; i < mak; i++){
  41. for(int j = 0; j < mak; j++)
  42. cout << board[i][j];
  43. cout << endl;
  44. }
  45. cout << endl;
  46. }
  47.  
  48. void set_block(int x, int y, int sajz){
  49. setup[sajz] = {x, y};
  50. score -= sajz * sajz;
  51.  
  52. if(score <= target){
  53. print_ans();
  54. exit(0);
  55. }
  56. }
  57.  
  58. void unset_block(int x, int y, int sajz){
  59. setup[sajz] = {-1, -1};
  60. score += sajz * sajz;
  61. }
  62.  
  63. inline bool square_intersect(pii a, int aLen, pii b, int bLen){
  64. pii l1 = a, r1 = {a.fi + aLen - 1, a.se + aLen - 1};
  65. pii l2 = b, r2 = {b.fi + bLen - 1, b.se + bLen - 1};
  66.  
  67. if(l1.fi > r2.fi || l2.fi > r1.fi) return false;
  68. if(l1.se > r2.se || l2.se > r2.se) return false;
  69. return true;
  70. }
  71.  
  72. bool free_point(int x, int y, int sajz){
  73. for(int i = 24; i > 0; i--){
  74. if(setup[i] == make_pair(-1, -1)) continue;
  75. if(square_intersect(make_pair(x, y), sajz, setup[i], i))
  76. return false;
  77. }
  78. return true;
  79. }
  80.  
  81. void backtrack(int x, bool to_l){
  82. if(setup[x] != make_pair(-1, -1)){
  83. backtrack(x - 1, to_l);
  84. return;
  85. }
  86. if(x == 0){
  87. print_ans();
  88. return;
  89. }
  90.  
  91. if(to_l){
  92. for(int i = 0; i < mak - x; i++)
  93. for(int j = 0; j < mak - x; j++)
  94. if(free_point(i, j, x)){
  95. set_block(i, j, x);
  96. backtrack(x - 1, to_l^1);
  97. unset_block(i, j, x);
  98. }
  99. for(int j = 0; j < mak - x; j++)
  100. for(int i = 0; i < mak - x; i++)
  101. if(free_point(i, j, x)){
  102. set_block(i, j, x);
  103. backtrack(x - 1, to_l^1);
  104. unset_block(i, j, x);
  105. }
  106. }
  107. else{
  108. for(int j = 0; j < mak - x; j++)
  109. for(int i = 0; i < mak - x; i++)
  110. if(free_point(i, j, x)){
  111. set_block(i, j, x);
  112. backtrack(x - 1, to_l^1);
  113. unset_block(i, j, x);
  114. }
  115. for(int i = 0; i < mak - x; i++)
  116. for(int j = 0; j < mak - x; j++)
  117. if(free_point(i, j, x)){
  118. set_block(i, j, x);
  119. backtrack(x - 1, to_l^1);
  120. unset_block(i, j, x);
  121. }
  122. }
  123.  
  124. backtrack(x - 1, to_l);
  125.  
  126. }
  127.  
  128. int main(){
  129.  
  130. //początkowe ustawienie planszy
  131. score = 4900;
  132.  
  133. for(int i = 1; i < 25; i++)
  134. setup[i] = setup[i] = {-1, -1};
  135.  
  136. //ustawiam ciąg fibonacciego w lewym górym rogu
  137. set_block(0, 0, 21);
  138. set_block(21, 0, 5);
  139. set_block(26, 0, 8);
  140. set_block(21, 5, 1);
  141. set_block(21, 6, 2);
  142. set_block(21, 8, 13);
  143. set_block(23, 5, 3);
  144.  
  145. backtrack(24, 1);
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement