提交时间:2024-04-28 21:49:38
运行 ID: 28701
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 9; struct TET { string Name; int type, px[4], py[4]; } bl[29]; string NUMBER[4]; int rev[29], A[5][5]; void init() { NUMBER[1] = "1", NUMBER[2] = "2", NUMBER[3] = "3"; bl[1].Name = "Z", bl[1].type = 1; bl[1].px[0] = 0, bl[1].px[1] = 0, bl[1].px[2] = 1, bl[1].px[3] = 1; bl[1].py[0] = 0, bl[1].py[1] = 1, bl[1].py[2] = 1, bl[1].py[3] = 2; bl[5].Name = "S", bl[5].type = 2; bl[5].px[0] = 0, bl[5].px[1] = 0, bl[5].px[2] = 1, bl[5].px[3] = 1; bl[5].py[0] = 1, bl[5].py[1] = 2, bl[5].py[2] = 0, bl[5].py[3] = 1; bl[9].Name = "J", bl[9].type = 3; bl[9].px[0] = 0, bl[9].px[1] = 1, bl[9].px[2] = 1, bl[9].px[3] = 1; bl[9].py[0] = 0, bl[9].py[1] = 0, bl[9].py[2] = 1, bl[9].py[3] = 2; bl[13].Name = "L", bl[13].type = 4; bl[13].px[0] = 0, bl[13].px[1] = 1, bl[13].px[2] = 1, bl[13].px[3] = 1; bl[13].py[0] = 2, bl[13].py[1] = 0, bl[13].py[2] = 1, bl[13].py[3] = 2; bl[17].Name = "T", bl[17].type = 5; bl[17].px[0] = 0, bl[17].px[1] = 1, bl[17].px[2] = 1, bl[17].px[3] = 1; bl[17].py[0] = 1, bl[17].py[1] = 0, bl[17].py[2] = 1, bl[17].py[3] = 2; bl[21].Name = "O", bl[21].type = 6; bl[21].px[0] = 0, bl[21].px[1] = 0, bl[21].px[2] = 1, bl[21].px[3] = 1; bl[21].py[0] = 0, bl[21].py[1] = 1, bl[21].py[2] = 0, bl[21].py[3] = 1; bl[25].Name = "I", bl[25].type = 7; bl[25].px[0] = 0, bl[25].px[1] = 0, bl[25].px[2] = 0, bl[25].px[3] = 0; bl[25].py[0] = 0, bl[25].py[1] = 1, bl[25].py[2] = 2, bl[25].py[3] = 3; for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 3; j++) { int _i = (i - 1) * 4 + 1 + j, mx = 1e9, my = 1e9; for (int k = 0; k <= 3; k++) { bl[_i].px[k] = bl[_i - 1].py[k]; bl[_i].py[k] = -bl[_i - 1].px[k]; mx = min(mx, bl[_i].px[k]), my = min(my, bl[_i].py[k]); } for (int k = 0; k <= 3; k++) { bl[_i].px[k] -= mx, bl[_i].py[k] -= my; } bl[_i].type = i, bl[_i].Name = bl[(i - 1) * 4 + 1].Name + NUMBER[j]; } bl[(i - 1) * 4 + 1].Name += "0"; } for (int i = 1; i <= 28; i++) { for (int j = 0; j <= 3; j++) { A[bl[i].py[j]][bl[i].px[j]] = 1; } for (int j = 1; j <= 28; j++) { int fl = 1; for (int k = 0; k <= 3; k++) { if (!A[bl[j].px[k]][bl[j].py[k]]) { fl = 0; break; } } if (fl) {rev[i] = j; break;} } for (int j = 0; j <= 3; j++) { A[bl[i].py[j]][bl[i].px[j]] = 0; } } } int n, m, tot, a[N], cnt[9]; int id(int x, int y) {return (x - 1) * m + y;} bool chk(int x, int y, int t) { for (int i = 0; i <= 3; i++) { int _x = x + bl[t].px[i], _y = y + bl[t].py[i]; if (_x > n || _y > m || a[id(_x, _y)]) return 0; } return 1; } int ans[N][3], tp, fl; void print(string s) { for (int i = 0; i < s.size(); i++) putchar(s[i]); putchar(' '); } int unit8_7[19][3] = {{0, 0, 0}, {1, 1, 1}, {1, 1, 3}, {11, 1, 5}, {6, 2, 1}, {6, 2, 6}, {10, 3, 3}, {18, 3, 5}, {18, 4, 1}, {14, 4, 4}, {21, 5, 6}, {16, 6, 2}, {21, 7, 1}, {25, 7, 4}, {25, 8, 4}}; int unit4_14[19][3] = {{0, 0, 0}, {6, 1, 1}, {9, 3, 1}, {1, 1, 2}, {1, 3, 3}, {16, 1, 4}, {6, 1, 6}, {9, 3, 6}, {19, 1, 7}, {25, 3, 8}, {17, 1, 9}, {25, 4, 9}, {16, 1, 11}, {21, 1, 13}, {21, 3, 13}}; int unit4_28[31][3] = {{0, 0, 0}, {6, 1, 1}, {9, 3, 1}, {1, 1, 2}, {1, 3, 3}, {1, 1, 4}, {1, 3, 5}, {16, 1, 6}, {6, 1, 8}, {9, 3, 8}, {16, 1, 9}, {6, 1, 11}, {9, 3, 11}, {16, 1, 12}, {6, 1, 14}, {9, 3, 14}, {16, 1, 15}, {19, 1, 17}, {18, 2, 17}, {25, 4, 18}, {21, 2, 19}, {25, 1, 20}, {21, 2, 21}, {25, 4, 22}, {21, 2, 23}, {25, 1, 24}, {21, 2, 25}, {17, 3, 26}, {20, 1, 27}}; int unit6_28[45][3] = {{0, 0, 0}, {6, 1, 1}, {6, 3, 1}, {9, 5, 1}, {1, 1, 2}, {1, 3, 3}, {6, 4, 3}, {1, 1, 4}, {1, 3, 5}, {15, 5, 5}, {1, 1, 6}, {25, 6, 6}, {1, 3, 7}, {16, 1, 8}, {11, 5, 8}, {6, 1, 10}, {6, 3, 10}, {16, 1, 11}, {25, 6, 11}, {15, 4, 12}, {15, 1, 13}, {11, 3, 13}, {11, 5, 13}, {11, 2, 14}, {16, 1, 16}, {11, 4, 16}, {21, 5, 16}, {19, 1, 18}, {6, 2, 18}, {25, 6, 18}, {25, 5, 19}, {18, 2, 20}, {21, 1, 21}, {17, 3, 21}, {17, 5, 22}, {21, 1, 23}, {25, 3, 23}, {21, 4, 24}, {21, 1, 25}, {17, 5, 25}, {20, 3, 26}, {21, 1, 27}, {26, 3, 28}}; int unit3_56[45][3] = {{0, 0, 0}, {18, 1, 1}, {1, 1, 2}, {1, 1, 4}, {1, 1, 6}, {25, 3, 2}, {25, 3, 6}, {19, 1, 8}, {21, 2, 10}, {19, 1, 11}, {17, 3, 12}, {21, 1, 14}, {12, 1, 15}, {18, 1, 17}, {25, 1, 18}, {25, 1, 22}, {25, 1, 26}, {5, 2, 18}, {5, 2, 20}, {5, 2, 22}, {5, 2, 24}, {5, 2, 26}, {5, 2, 28}, {10, 1, 30}, {17, 2, 30}, {21, 1, 33}, {13, 3, 33}, {16, 1, 35}, {1, 1, 37}, {9, 2, 37}, {16, 1, 39}, {1, 1, 41}, {9, 2, 41}, {16, 1, 43}, {1, 1, 45}, {9, 2, 45}, {16, 1, 47}, {14, 1, 49}, {21, 1, 50}, {12, 1, 51}, {21, 1, 53}, {21, 1, 55}, {25, 3, 53}}; int unit4_56[59][3] = {{0, 0, 0}, {6, 1, 1}, {9, 3, 1}, {1, 1, 2}, {1, 3, 3}, {1, 1, 4}, {1, 3, 5}, {1, 1, 6}, {1, 3, 7}, {1, 1, 8}, {1, 3, 9}, {16, 1, 10}, {6, 1, 12}, {9, 3, 12}, {16, 1, 13}, {6, 1, 15}, {9, 3, 15}, {16, 1, 16}, {6, 1, 18}, {9, 3, 18}, {16, 1, 19}, {6, 1, 21}, {9, 3, 21}, {16, 1, 22}, {6, 1, 24}, {9, 3, 24}, {16, 1, 25}, {6, 1, 27}, {9, 3, 27}, {16, 1, 28}, {6, 1, 30}, {9, 3, 30}, {16, 1, 31}, {19, 1, 33}, {18, 2, 33}, {25, 4, 34}, {21, 2, 35}, {19, 1, 36}, {19, 3, 37}, {25, 2, 38}, {25, 1, 39}, {25, 4, 39}, {25, 3, 40}, {17, 1, 42}, {17, 3, 43}, {25, 1, 44}, {21, 2, 45}, {25, 4, 46}, {21, 2, 47}, {25, 1, 48}, {21, 2, 49}, {17, 3, 50}, {20, 1, 51}, {21, 1, 53}, {21, 3, 53}, {21, 1, 55}, {21, 3, 55}}; int unit5_56[75][3] = {{0, 0, 0}, {6, 1, 1}, {14, 3, 1}, {1, 1, 2}, {1, 4, 2}, {1, 3, 3}, {1, 1, 4}, {1, 3, 5}, {25, 5, 5}, {1, 1, 6}, {1, 3, 7}, {1, 1, 8}, {1, 3, 9}, {25, 5, 9}, {1, 1, 10}, {19, 3, 11}, {19, 1, 12}, {15, 4, 13}, {15, 2, 14}, {25, 5, 14}, {11, 1, 15}, {19, 3, 15}, {19, 4, 17}, {15, 1, 18}, {11, 3, 18}, {11, 2, 19}, {25, 5, 19}, {16, 1, 21}, {11, 4, 21}, {15, 1, 23}, {16, 3, 23}, {16, 2, 24}, {25, 5, 25}, {6, 1, 26}, {9, 3, 26}, {16, 1, 27}, {6, 1, 29}, {14, 3, 29}, {11, 1, 30}, {19, 4, 30}, {9, 2, 31}, {25, 5, 32}, {6, 1, 33}, {25, 4, 33}, {11, 1, 34}, {9, 2, 35}, {25, 5, 36}, {21, 1, 37}, {5, 3, 37}, {6, 1, 39}, {19, 4, 39}, {19, 1, 40}, {19, 3, 41}, {25, 5, 41}, {5, 1, 42}, {5, 3, 43}, {5, 1, 44}, {21, 4, 45}, {6, 2, 46}, {21, 1, 47}, {25, 5, 47}, {21, 3, 48}, {21, 1, 49}, {21, 3, 50}, {21, 1, 51}, {17, 4, 51}, {19, 3, 52}, {21, 1, 53}, {9, 4, 54}, {21, 1, 55}, {21, 3, 55}}; int main() { scanf("%d%d", &n, &m); if (n * m % 56 || min(n, m) <= 2) { printf("No\n"); return 0; } tot = n * m / 28; init(); printf("Yes\n"); if (n % 7 == 0 && m % 7 != 0) swap(n, m), fl ^= 1; if (n % 8 == 0) { for (int i = 0; i < n; i += 8) { for (int j = 0; j < m; j += 7) { for (int k = 1; k <= 14; k++) { int _x = i + unit8_7[k][1], _y = j + unit8_7[k][2], t = unit8_7[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } } return 0; } else if (n % 4 == 0) { for (int i = 0; i < n; i += 4) { for (int j = 0; j < m; j += 14) { for (int k = 1; k <= 14; k++) { int _x = i + unit4_14[k][1], _y = j + unit4_14[k][2], t = unit4_14[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } } return 0; } else if (n % 2 == 0) { for (int j = 0; j < m; j += 28) { for (int k = 1; k <= 42; k++) { int _x = unit6_28[k][1], _y = j + unit6_28[k][2], t = unit6_28[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } for (int i = 6; i < n; i += 4) { for (int j = 0; j < m; j += 28) { for (int k = 1; k <= 28; k++) { int _x = i + unit4_28[k][1], _y = j + unit4_28[k][2], t = unit4_28[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } } return 0; } else { int st; if (n % 4 == 3) { st = 3; for (int j = 0; j < m; j += 56) { for (int k = 1; k <= 42; k++) { int _x = unit3_56[k][1], _y = j + unit3_56[k][2], t = unit3_56[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } } else { st = 5; for (int j = 0; j < m; j += 56) { for (int k = 1; k <= 70; k++) { int _x = unit5_56[k][1], _y = j + unit5_56[k][2], t = unit5_56[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } } for (int i = st; i < n; i++) { for (int j = 0; j < m; j += 56) { for (int k = 1; k <= 56; k++) { int _x = i + unit4_56[k][1], _y = j + unit4_56[k][2], t = unit4_56[k][0]; if (!fl) print(bl[t].Name), printf("%d %d\n", _x, _y); else print(bl[rev[t]].Name), printf("%d %d\n", _y, _x); } } } return 0; } return 0; }