Timus: [1125. Hopscotch]

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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/knull/p/10424043.html
今日推荐