1. 程式人生 > 實用技巧 >2020牛客多校第六場 G.Grid Coloring 構造

2020牛客多校第六場 G.Grid Coloring 構造

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