题目链接:https://ac.nowcoder.com/acm/contest/5671/G
题目大意:有一个nn的图。例如:2*2:
图片说明
边的条数:n
(n+1)/2。选择有k条边。对边进行染色。限制条件:
1.所有的颜色染的边数相等。
2.一行和一列所有边的颜色不能为同一种。
3.没有同一个颜色的边形成一个环。
图片说明
问:给一个n和k。能不能构造,不能输出-1.可以就输出方案。先输出n+1行。再输出n+1列。
图片说明

思路:
1.如果n=1, k=1, n(n+1)%k=0就输出-1.
2.如果n%k==0。
对每一行:
1,2,3...k, 1,2,3...k
下一行我们移一个位:
2,3...k,1, 2,3...k,1
例如:n=8, k=4
图片说明
3.如果n%k!=0
对第一行1开始。1,2,3,...k,1,2,3...k一直循环构造就可以了。
例如:n=8, k=5
图片说明

#include<bits/stdc++.h>
#define LL long long
using namespace std;

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        int n, k; scanf("%d%d", &n, &k);
        int s=n*(n+1)*2;
        if(n==1||s%k!=0||k==1){
            printf("-1\n");
        }
        else{
            if(n%k==0){
                int last=0;
                for(int i=1; i<=n+1; i++){
                    for(int j=1; j<=n; j++){
                        printf("%d ",last+1);
                        last=(last+1)%k;
                    }
                    printf("\n");
                    last=(last+1)%k;
                    if(i%2==0){
                        last=0;
                    }
                }
                last=0;
                for(int i=1; i<=n+1; i++){
                    for(int j=1; j<=n; j++){
                        printf("%d ",last+1);
                        last=(last+1)%k;
                    }
                    printf("\n");
                    last=(last+1)%k;
                    if(i%2==0){
                        last=0;
                    }
                }
            }
            else{
                int last=0;
                for(int i=1; i<=n+1; i++){
                    for(int j=1; j<=n; j++){
                        printf("%d ",last+1);
                        last=(last+1)%k;
                    }
                    printf("\n");
                }
                for(int i=1; i<=n+1; i++){
                    for(int j=1; j<=n; j++){
                        printf("%d ",last+1);
                        last=(last+1)%k;
                    }
                    printf("\n");
                }
            }
        }
    }

    return 0;
}