题目链接: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;
}
京公网安备 11010502036488号