首页 > 其他 > 详细

C - Coloring Torus

时间:2019-12-25 23:48:28      阅读:82      评论:0      收藏:0      [点我收藏+]

本篇 blog 没有翻译,告辞


考虑从简单的开始。当 \(n = k\) 时,一个排列复制 \(n\) 遍。

然而 \(n\)\(\frac{k}{2}\) 级别的,那么就扩展一下,当 \(4 | k\) 时,我们弄个 \(n = \frac{k}{2}\) 的矩阵,排列填到前两行,复制 \(\frac{n}{2}\) 遍。

然而当我们 \(k\) 为奇数的时候怎么办?

\(k + 1\) 的时候貌似有点麻烦。考虑 \(k - 1\)

考虑把最大的换掉。显然换成特殊的比较好,那么就它上面那个了。然而如果要满足换成的那个颜色的限制,发现可以循环位移,第 \(i\) 行移 \(i\) 格。其实这样还可以一直构造到 \(k = n\)

乱糊的一篇低质量文。

#include <bits/stdc++.h>

const int MAXN = 1010;
int A[2][MAXN];
int K, n;
void shift(int * A) {
    memmove(A, A + 1, n << 2);
    A[n] = A[0];
}
int main() {
    std::ios_base::sync_with_stdio(false), std::cin.tie(0);
    std::cin >> K; n = (K + 3 >> 2) << 1;
    if (K == 1) return std::cout << "1\n1\n", 0;
    auto red = [] (int x) { return x > K ? x - n : x; };
    int idx = 0;
    for (int k = 0; k < 2; ++k)
        for (int j = 1; j <= n; ++j)
            A[k][j] = ++idx;
    shift(A[1]);
    std::cout << n << '\n';
    for (int i = 1; i <= n / 2; ++i) {
        for (int k = 0; k < 2; ++k)
            for (int j = 1; j <= n; ++j)
                std::cout << red(A[k][j]) << (" \n" [j == n]);
        shift(A[0]); shift(A[0]);
        shift(A[1]); shift(A[1]);
    }
    return 0;
}

C - Coloring Torus

原文:https://www.cnblogs.com/daklqw/p/12099009.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!