Timus: [1125. Hopscotch]
奇偶性的问题,加上一个pythagorean triplet,没什么算法,枚举了以后发现已经可以到0.001ms并且内存占用不高。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define MAX_N 50 int M, N; int board[MAX_N][MAX_N]; int R[MAX_N]; int C[MAX_N]; char buf[MAX_N + 1]; #define K 8 int P[K][2] = { { 3, 4 }, { 5, 12 }, { 8, 15 }, { 7, 24 }, { 20, 21 }, { 12, 35 }, { 9, 40 }, { 28, 45 } }; int valid(int x, int y) { return x >= 0 && x < M && y >= 0 && y < N; } void process(int x, int y) { R[x] = !R[x]; C[y] = !C[y]; board[x][y] = !board[x][y]; for (int i = 0; i < K; ++i) { for (int s = 0; s < 8; ++s) { int t = (s >> 2) & 1; int dx = ((s & 1) ? 1 : -1) * P[i][t]; int dy = (((s >> 1) & 1) ? 1 : -1) * P[i][!t]; for (int r = x + dx, c = y + dy; valid(r, c); r += dx, c += dy) { board[r][c] = !board[r][c]; } } } } void solve() { scanf("%d%d", &M, &N); for (int i = 0; i < M; ++i) { scanf("%s", buf); for (int k = 0; k < N; ++k) { board[i][k] = buf[k] == 'B'; } } for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { int x; scanf("%d", &x); if (x & 1) { process(i, j); } } } for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { putchar(board[i][j] ^ R[i] ^ C[j] ? 'B' : 'W'); } putchar('\n'); } } int main() { solve(); return 0; }