sacgajcvs

Untitled

Sep 17th, 2022
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define CMD_INIT 100
  4. #define CMD_DESTROY 200
  5. #define CMD_PUT 300
  6. #define MAX_N 1000
  7.  
  8. void init(int N, int M, int mU[][4], int mR[][4], int mB[][4], int mL[][4]);
  9. void destroy();
  10. int put(int mPiece[4]);
  11.  
  12. static int PieceU[MAX_N + 2][4];
  13. static int PieceR[MAX_N + 2][4];
  14. static int PieceD[MAX_N + 2][4];
  15. static int PieceL[MAX_N + 2][4];
  16.  
  17. static int run() {
  18. int isOK = 0;
  19. int N;
  20. int cmd, result = 0, check;
  21. int mN, nM;
  22. int mPiece[4];
  23. scanf("%d", &N);
  24.  
  25. for(int c = 0; c < N; c++) {
  26. scanf("%d", &cmd);
  27. switch(cmd) {
  28. case CMD_INIT:
  29. scanf("%d %d", &mN, &nM);
  30. for(int i = 0; i < mN; i++) {
  31. scanf("%d %d %d %d", &PieceU[i][0], &PieceU[i][1], &PieceU[i][2], &PieceU[i][3]);
  32. }
  33. for(int i = 0; i < mN; i++) {
  34. scanf("%d %d %d %d", &PieceR[i][0], &PieceR[i][1], &PieceR[i][2], &PieceR[i][3]);
  35. }
  36. for(int i = 0; i < mN; i++) {
  37. scanf("%d %d %d %d", &PieceD[i][0], &PieceD[i][1], &PieceD[i][2], &PieceD[i][3]);
  38. }
  39. for(int i = 0; i < mN; i++) {
  40. scanf("%d %d %d %d", &PieceL[i][0], &PieceL[i][1], &PieceL[i][2], &PieceL[i][3]);
  41. }
  42. init(mN, nM, PieceU, PieceR, PieceD, PieceL);
  43. isOK = 1;
  44. break;
  45. case CMD_PUT:
  46. scanf("%d %d %d %d", &mPiece[0], &mPiece[1], &mPiece[2], &mPiece[3]);
  47. result = put(mPiece);
  48. scanf("%d", &check);
  49. if(result != check) isOK = 0;
  50. break;
  51.  
  52. default:
  53. isOK = 0;
  54. break;
  55. }
  56. }
  57. destroy();
  58. return isOK;
  59. }
  60.  
  61. int main()
  62. {
  63. int T, MARK;
  64. scanf("%d %d", &T, &MARK);
  65. for(int tc = 1; tc <= T; tc++) {
  66. if(run()) printf("#%d %d\n", tc, MARK);
  67. else printf("#%d %d\n", tc, 0);
  68. }
  69. return 0;
  70. }
  71.  
  72. vector<vector<vector<int>>> v;
  73. vector<vector<bool>> vis;
  74. int n, m;
  75. void init(int N, int M, int mU[][4], int mR[][4], int mB[][4], int mL[][4]) {
  76. v = vector<vector<vector<int>>>(N + 2, vector<vector<int>>(N + 2, vector<int>(4)));
  77. vis = vector<vector<bool>>(N + 2, vector<bool>(N + 2, false));
  78. n = N, m = M;
  79. for(int i = 1; i <= N; i++) {
  80. for(int j = 0; j < 4; j++) {
  81. v[0][i][j] = mU[i - 1][j];
  82. vis[0][i] = true;
  83. }
  84. }
  85. for(int i = 1; i <= N; i++) {
  86. for(int j = 0; j < 4; j++) {
  87. v[i][0][j] = mL[i - 1][j];
  88. vis[i][0] = true;
  89. }
  90. }
  91. for(int i = 1; i <= N; i++) {
  92. for(int j = 0; j < 4; j++) {
  93. v[N + 1][i][j] = mB[i - 1][j];
  94. vis[N + 1][i] = true;
  95. }
  96. }
  97. for(int i = 1; i <= N; i++) {
  98. for(int j = 0; j < 4; j++) {
  99. v[i][N + 1][j] = mR[i - 1][j];
  100. vis[i][N + 1] = true;
  101. }
  102. }
  103. }
  104.  
  105. string num2string(int num) {
  106. string s = "";
  107. while(num > 0) {
  108. s += (char)((num % 10) + '0');
  109. num /= 10;
  110. }
  111. return s;
  112. }
  113.  
  114. bool checkMatch(int num, int num1) {
  115. string aa = num2string(num);
  116. string ab = num2string(num1);
  117. reverse(ab.begin(), ab.end());
  118. for(int i = 0; i < m; i++) {
  119. if(((int)(aa[i] - '0') + (int)(ab[i] - '0')) != 10) {
  120. return false;
  121. }
  122. }
  123. // cout << aa << " === " << ab << endl;
  124. return true;
  125. }
  126.  
  127. int check(int x, int y, vector<int>& a) {
  128. int cnt = 0;
  129. cnt += (vis[x - 1][y] && checkMatch(a[0], v[x - 1][y][2]));
  130. cnt += (vis[x][y - 1] && checkMatch(a[3], v[x][y - 1][3]));
  131. cnt += (vis[x + 1][y] && checkMatch(a[2], v[x + 1][y][0]));
  132. cnt += (vis[x][y + 1] && checkMatch(a[1], v[x][y + 1][1]));
  133. // cout << x << " " << y << " " << -> ";
  134. // for(int i = 0; i < 4; i++) {
  135. // cout << a[i] << " ";
  136. // }
  137. // cout << " -> " << cnt << endl;
  138. // cout << endl;
  139. return cnt;
  140. }
  141.  
  142. int put(int mPiece[4]) {
  143. vector<vector<int>> a(4, vector<int>(4));
  144. for(int i = 0; i < 4; i++) {
  145. a[0][i] = mPiece[i];
  146. }
  147. for(int i = 0; i < 4; i++) {
  148. a[1][i] = mPiece[(i + 1) % 4];
  149. }
  150. for(int i = 0; i < 4; i++) {
  151. a[2][i] = mPiece[(i + 2) % 4];
  152. }
  153. for(int i = 0; i < 4; i++) {
  154. a[3][i] = mPiece[(i + 3) % 4];
  155. }
  156. pair<int, int> ps(-1, -1);
  157. int cnt = 0;
  158. for(int i = 1; i < n + 1; i++) {
  159. for(int j = 1; j < n + 1; j++) {
  160. if(vis[i][j]) continue;
  161. int cur;
  162. for(int k = 0; k < 4; k++) {
  163. cur = check(i, j, a[k]);
  164. if(cnt < cur) {
  165. cnt = cur;
  166. ps = {i, j};
  167. }
  168. }
  169. // cout << i << " " << j << " " << cnt << endl;
  170. }
  171. }
  172. if(cnt == 0) return -1;
  173. vis[ps.first][ps.second] = true;
  174. for(int k = 0; k < 4; k++) {
  175. if(cnt == check(ps.first, ps.second, a[k])) {
  176. v[ps.first][ps.second] = a[k];
  177. break;
  178. }
  179. }
  180. // for(int i = 0; i < 4; i++) {
  181. // cout << v[5][2][i] << " ";
  182. // }
  183. // cout << endl;
  184. // cout << ps.first << " " << ps.second << endl;
  185. return ps.first + ps.second;
  186. }
  187.  
  188. void destroy() {
  189.  
  190. }
Advertisement
Add Comment
Please, Sign In to add comment