题目链接: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; }