Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define CMD_INIT 100
- #define CMD_DESTROY 200
- #define CMD_PUT 300
- #define MAX_N 1000
- void init(int N, int M, int mU[][4], int mR[][4], int mB[][4], int mL[][4]);
- void destroy();
- int put(int mPiece[4]);
- static int PieceU[MAX_N + 2][4];
- static int PieceR[MAX_N + 2][4];
- static int PieceD[MAX_N + 2][4];
- static int PieceL[MAX_N + 2][4];
- static int run() {
- int isOK = 0;
- int N;
- int cmd, result = 0, check;
- int mN, nM;
- int mPiece[4];
- scanf("%d", &N);
- for(int c = 0; c < N; c++) {
- scanf("%d", &cmd);
- switch(cmd) {
- case CMD_INIT:
- scanf("%d %d", &mN, &nM);
- for(int i = 0; i < mN; i++) {
- scanf("%d %d %d %d", &PieceU[i][0], &PieceU[i][1], &PieceU[i][2], &PieceU[i][3]);
- }
- for(int i = 0; i < mN; i++) {
- scanf("%d %d %d %d", &PieceR[i][0], &PieceR[i][1], &PieceR[i][2], &PieceR[i][3]);
- }
- for(int i = 0; i < mN; i++) {
- scanf("%d %d %d %d", &PieceD[i][0], &PieceD[i][1], &PieceD[i][2], &PieceD[i][3]);
- }
- for(int i = 0; i < mN; i++) {
- scanf("%d %d %d %d", &PieceL[i][0], &PieceL[i][1], &PieceL[i][2], &PieceL[i][3]);
- }
- init(mN, nM, PieceU, PieceR, PieceD, PieceL);
- isOK = 1;
- break;
- case CMD_PUT:
- scanf("%d %d %d %d", &mPiece[0], &mPiece[1], &mPiece[2], &mPiece[3]);
- result = put(mPiece);
- scanf("%d", &check);
- if(result != check) isOK = 0;
- break;
- default:
- isOK = 0;
- break;
- }
- }
- destroy();
- return isOK;
- }
- int main()
- {
- int T, MARK;
- scanf("%d %d", &T, &MARK);
- for(int tc = 1; tc <= T; tc++) {
- if(run()) printf("#%d %d\n", tc, MARK);
- else printf("#%d %d\n", tc, 0);
- }
- return 0;
- }
- vector<vector<vector<int>>> v;
- vector<vector<bool>> vis;
- int n, m;
- void init(int N, int M, int mU[][4], int mR[][4], int mB[][4], int mL[][4]) {
- v = vector<vector<vector<int>>>(N + 2, vector<vector<int>>(N + 2, vector<int>(4)));
- vis = vector<vector<bool>>(N + 2, vector<bool>(N + 2, false));
- n = N, m = M;
- for(int i = 1; i <= N; i++) {
- for(int j = 0; j < 4; j++) {
- v[0][i][j] = mU[i - 1][j];
- vis[0][i] = true;
- }
- }
- for(int i = 1; i <= N; i++) {
- for(int j = 0; j < 4; j++) {
- v[i][0][j] = mL[i - 1][j];
- vis[i][0] = true;
- }
- }
- for(int i = 1; i <= N; i++) {
- for(int j = 0; j < 4; j++) {
- v[N + 1][i][j] = mB[i - 1][j];
- vis[N + 1][i] = true;
- }
- }
- for(int i = 1; i <= N; i++) {
- for(int j = 0; j < 4; j++) {
- v[i][N + 1][j] = mR[i - 1][j];
- vis[i][N + 1] = true;
- }
- }
- }
- string num2string(int num) {
- string s = "";
- while(num > 0) {
- s += (char)((num % 10) + '0');
- num /= 10;
- }
- return s;
- }
- bool checkMatch(int num, int num1) {
- string aa = num2string(num);
- string ab = num2string(num1);
- reverse(ab.begin(), ab.end());
- for(int i = 0; i < m; i++) {
- if(((int)(aa[i] - '0') + (int)(ab[i] - '0')) != 10) {
- return false;
- }
- }
- // cout << aa << " === " << ab << endl;
- return true;
- }
- int check(int x, int y, vector<int>& a) {
- int cnt = 0;
- cnt += (vis[x - 1][y] && checkMatch(a[0], v[x - 1][y][2]));
- cnt += (vis[x][y - 1] && checkMatch(a[3], v[x][y - 1][3]));
- cnt += (vis[x + 1][y] && checkMatch(a[2], v[x + 1][y][0]));
- cnt += (vis[x][y + 1] && checkMatch(a[1], v[x][y + 1][1]));
- // cout << x << " " << y << " " << -> ";
- // for(int i = 0; i < 4; i++) {
- // cout << a[i] << " ";
- // }
- // cout << " -> " << cnt << endl;
- // cout << endl;
- return cnt;
- }
- int put(int mPiece[4]) {
- vector<vector<int>> a(4, vector<int>(4));
- for(int i = 0; i < 4; i++) {
- a[0][i] = mPiece[i];
- }
- for(int i = 0; i < 4; i++) {
- a[1][i] = mPiece[(i + 1) % 4];
- }
- for(int i = 0; i < 4; i++) {
- a[2][i] = mPiece[(i + 2) % 4];
- }
- for(int i = 0; i < 4; i++) {
- a[3][i] = mPiece[(i + 3) % 4];
- }
- pair<int, int> ps(-1, -1);
- int cnt = 0;
- for(int i = 1; i < n + 1; i++) {
- for(int j = 1; j < n + 1; j++) {
- if(vis[i][j]) continue;
- int cur;
- for(int k = 0; k < 4; k++) {
- cur = check(i, j, a[k]);
- if(cnt < cur) {
- cnt = cur;
- ps = {i, j};
- }
- }
- // cout << i << " " << j << " " << cnt << endl;
- }
- }
- if(cnt == 0) return -1;
- vis[ps.first][ps.second] = true;
- for(int k = 0; k < 4; k++) {
- if(cnt == check(ps.first, ps.second, a[k])) {
- v[ps.first][ps.second] = a[k];
- break;
- }
- }
- // for(int i = 0; i < 4; i++) {
- // cout << v[5][2][i] << " ";
- // }
- // cout << endl;
- // cout << ps.first << " " << ps.second << endl;
- return ps.first + ps.second;
- }
- void destroy() {
- }
Advertisement
Add Comment
Please, Sign In to add comment