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