Advertisement
a53

Patratele

a53
Apr 3rd, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. /**
  2. Autor: Bogdan-Ioan Popa, FMI Universitatea din Bucuresti
  3. Scor: 100p
  4. **/
  5.  
  6. #include <bits/stdc++.h>
  7.  
  8. #define N_MAX 60
  9.  
  10. using namespace std;
  11.  
  12. ifstream fin("patratele.in");
  13. ofstream fout("patratele.out");
  14.  
  15. int N, M, t;
  16.  
  17. int A[N_MAX + 5][N_MAX + 5];
  18. int up[N_MAX + 5][N_MAX + 5];
  19. int ri[N_MAX + 5][N_MAX + 5];
  20. int dwn[N_MAX + 5][N_MAX + 5];
  21. int le[N_MAX + 5][N_MAX + 5];
  22. int ans[N_MAX + 5];
  23. int di[] = {-1, 0, 1, 0};
  24. int dj[] = {0, 1, 0, -1};
  25. int dir[] = {2, 3, 0, 1};
  26. int p2[] = {1, 2, 4, 8};
  27.  
  28. char side[][8] = {
  29. "SUS",
  30. "DREAPTA",
  31. "JOS",
  32. "STANGA"
  33. };
  34.  
  35. bool check_side(int conf, int side) {
  36. return conf / p2[side] % 2;
  37. }
  38.  
  39. void flip_side(int &conf, int side) {
  40. if(check_side(conf, side)) {
  41. conf -= p2[side];
  42. }
  43. else {
  44. conf += p2[side];
  45. }
  46. }
  47.  
  48. int compute_ans() {
  49. memset(ans, 0, sizeof(ans));
  50. memset(le, 0, sizeof(le));
  51. memset(ri, 0, sizeof(ri));
  52. memset(up, 0, sizeof(up));
  53. memset(dwn, 0, sizeof(dwn));
  54.  
  55. int total_ans = 0;
  56.  
  57. for(int i = 1; i <= N; i++) {
  58. for(int j = 1; j <= M; j++) {
  59. if(check_side(A[i][j], 1)) {
  60. up[i][j] = 1 + up[i - 1][j];
  61. }
  62.  
  63. if(check_side(A[i][j], 2)) {
  64. le[i][j] = 1 + le[i][j - 1];
  65. }
  66. }
  67. }
  68.  
  69. for(int i = N; i >= 1; i--) {
  70. for(int j = M; j >= 1; j--) {
  71. if(check_side(A[i][j], 0)) {
  72. ri[i][j] = 1 + ri[i][j + 1];
  73. }
  74.  
  75. if(check_side(A[i][j], 3)) {
  76. dwn[i][j] = 1 + dwn[i + 1][j];
  77. }
  78. }
  79. }
  80.  
  81. for(int i = 1; i <= N; i++) {
  82. for(int j = 1; j <= M; j++) {
  83. int max_k = min(min(dwn[i][j], ri[i][j]), min(N - i + 1, M - j + 1));
  84. for(int k = 1; k <= max_k; k++) {
  85. int ii = i + k - 1;
  86. int jj = j + k - 1;
  87. if(k <= up[ii][jj] && k <= le[ii][jj]) {
  88. ans[k]++;
  89. total_ans++;
  90. }
  91. }
  92. }
  93. }
  94. return total_ans;
  95. }
  96.  
  97. int main()
  98. {
  99. fin >> N >> M >> t;
  100. for(int i = 1; i <= N; i++) {
  101. for(int j = 1; j <= M; j++) {
  102. fin >> A[i][j];
  103. }
  104. }
  105.  
  106. int sol = compute_ans();
  107. if(t == 3) {
  108. int max_ans = sol;
  109. int ans_i, ans_j, ans_d;
  110. bool ok = false;
  111. for(int i = 1; i <= N; i++) {
  112. for(int j = 1; j <= M; j++) {
  113. for(int d = 0; d < 4; d++) {
  114. if(!check_side(A[i][j], d)) {
  115. int ii = i + di[d];
  116. int jj = j + dj[d];
  117. flip_side(A[i][j], d);
  118. flip_side(A[ii][jj], dir[d]);
  119. int curr = compute_ans();
  120. flip_side(A[i][j], d);
  121. flip_side(A[ii][jj], dir[d]);
  122. if(max_ans < curr) {
  123. ok = true;
  124. max_ans = curr;
  125. ans_i = i;
  126. ans_j = j;
  127. ans_d = d;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. if(!ok) {
  134. fout << "0\n0 0 NU\n";
  135. }
  136. else {
  137. fout << max_ans << "\n" << ans_i << " " << ans_j << " " << side[ans_d] << "\n";
  138. }
  139.  
  140. }
  141. else {
  142. if(t == 1) {
  143. fout << sol << "\n";
  144. }
  145. else {
  146. for(int i = 1; i <= N; i++) {
  147. if(ans[i] != 0) {
  148. fout << i << " " << ans[i] << "\n";
  149. }
  150. }
  151. }
  152. }
  153. return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement