题意:
给定n*n的矩阵和k种颜色,给矩阵每条边涂上1~k颜色。
满足三个条件
1.所有颜色出现的次数相同
2.颜色不能出现环
3.行列必须存在两种颜色以上即可
解析:
不存在的情况
n == 1,k==1 (2*(n+1)n)%k!=0 输出-1
因为n ==1 和 k == 1不满足条件3
(2(n+1)*n)%k!=0 所有颜色出现的次数不一样
讨论输出方案
第一种 n%k!=0
我们从行开始按照1~k涂色,到列的时候接上去即可
例如 n=2,k=3
行涂色
1 2
3 1
2 3
列涂色
1 2
3 1
2 3
第二种 n%k==0
我们按照以下排列
行涂色
n=3,k=3
1 2 3
2 1 3
3 1 2
1 2 3
列涂色
1 2 3
2 3 1
3 1 2
1 2 3
一定满足条件
#include <iostream>
using namespace std;
int n ,t,m;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
if(n==1||m==1||(2*(n+1)*n)%m!=0)
{
puts("-1");
continue;
}
if(n%m)
{
//int k=m;
int p=1;
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n;j++)
{
cout<<(p-1)%m+1<<" ";
++p;
}
printf("\n");
}
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n;j++)
{
cout<<(p-1)%m+1<<" ";
++p;
}
printf("\n");
}
}
else
{
int p=1;
for(int i=1;i<=n+1;i++)
{
p=(i-1)%m+1;
for(int j=1;j<=n;j++)
{
cout<<(p-1)%m+1<<" ";
++p;
}
printf("\n");
}
for(int i=1;i<=n+1;i++)
{
p=(i-1)%m+1;
for(int j=1;j<=n;j++)
{
cout<<(p-1)%m+1<<" ";
++p;
}
printf("\n");
}
}
}
return 0;
}
/*
1 2 3 1 2 3
2 3 1 2 3 1
3 1 2 3 1 2
1 2 3 1 2 3
2 3 1 2 3 1
3 1 2 3 1 2
1 2 3 1 2 3
1 2 3 1 2 3
2 3 1 2 3 1
3 1 2 3 1 2
1 2 3 1 2 3
2 3 1 2 3 1
3 1 2 3 1 2
1 2 3 1 2 3
*/