Grid Coloring

这是牛客多校第六场的G题,也是我第一篇关于牛客多校的博客。

这道题题目意思是给你一个n*n的细胞块,让我们通过给每一块的边缘绘色,让他满足以下三个条件:

(1)满足每种颜色的颜色数量相同;

(2)满足每一块不能全部用一个色绘边;

(3)满足同一行或者同一列要2种颜色以上;

题目给我们t组测试样例,然后给我们n和k种颜色。

大致分析一下可以得出以下结论:

(1)边的数量要是k的整数倍;

(2)n和k不能为1。

然后我们开始构造:

我们只需要保证同行 / 列没有两条相邻的边,且相邻两行 / 列同一列 / 行的边颜色不相同。

这是很好构造的,对于 ,直接按  顺序依次分配边权;对于 ,在偶数行 / 列上循环移 1 位即可。

然后附上AC代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
using namespace std;

long long  pow_mod(long long  a, long long k,long long mod)
{
    long long  ans = 1;
    a %= mod;
    while (k)
    {
        if (k % 2) ans *= a;
        a = (a * a) % mod;
        k /= 2;
        ans %= mod;
    }
    return ans;
}


int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, k;
        cin >> n>>k;
        if ((2 *n* (n + 1)) % k != 0||n==1||k==1)
        {
            cout << "-1" << endl;
        }
        else
        {
            if (n % k == 0)
            {
                int lazy = 0;
                for (int i = 1; i <= 2 * (n + 1); i++)
                {
                    int flag = lazy;
                    for (int j = 1; j <= n; j++)
                    {
                        flag = flag % k + 1;
                        printf("%d", flag);
                        if (j == n)printf("
");
                        else printf(" ");
                    }
                    lazy ^= 1;
                }
            }
            else
            {
                int lazy = 0;
                for (int i = 1; i <= 2 * (n + 1); i++)
                {
                    for (int j = 1; j <= n; j++)
                    {
                        lazy = lazy % k + 1;
                        printf("%d", lazy);
                        if (j == n)printf("
");
                        else printf(" ");
                    }
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/csxaxx/p/13390954.html