https://ac.nowcoder.com/acm/contest/5671/G

题意:

一个n*n的网格,k种颜色,给网格的边缘染色;

条件:

1.所有颜色出现相同的次数;

2.不存在单色环;

3.每条水平线或垂直线都应该至少包含两种颜色。

 

 输出每条水平线的颜色和垂直线的颜色;

没有答案输出-1。

解法:

n=1,或者k=1,或者 2*(n+1)*n%k != 0,都不能满足题意,输出-1;

否则如下图构造:

(原理我也不懂,问就是猜猜猜猜,,,赛中没看懂题意,题中的图没有显示,可能得换电脑了(误,赛后瞎jb猜了下,感觉第一排比第二排多一个会错开,应该可以,就试了一下,然后就过了,惊了!!!!!!!太tm亏了,比赛没做这题)

 

 

#include <bits/stdc++.h>
using namespace std;
const long long mod =1e9+7;
typedef long long ll;
const int inf =0x3f3f3f3f;
const long long INF =0x3f3f3f3f3f3f3f3f;
const int MAXN =5e2+5;
int a[MAXN][MAXN],b[MAXN][MAXN];
int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        if(2*(n+1)*n%k!=0||k<=1||n==1)
        {
            printf("-1\n");
            continue;
        }
        int cnt=0;
        for(int i=1;i<=n+1;i++)
        {
            for(int j=1;j<=n;j++)
            {
                a[i][j]=++cnt;
                if(cnt==k)cnt=0;
            }
            if(i!=n+1)
            {
                for(int j=n+1;j>=1;j--)
                {
                    b[i][j]=++cnt;
                    if(cnt==k)cnt=0;
                }
            }
        }

        for(int i=1;i<=n+1;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%d%c",a[i][j],j==n?'\n':' ');
            }
        }
        for(int i=1;i<=n+1;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%d%c",b[j][i],j==n?'\n':' ');
            }
        }
    }

    return 0;
}
View Code

 

posted on 2020-07-28 22:25  MZRONG  阅读(199)  评论(0编辑  收藏  举报