思路:
若有错误的地方请指正。若读者不理解,欢迎提问
1 如果k%n==0 ,那么每一行,每一列都有k个1就行,直接错开讲数组置1
2 如果r=k%n,r!=0,先进行操作1。再在前r行,每一行,错开放置一个1
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 300+9;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
int ans = 0;
cin>>n>>k;
int maxR = k/n;//每一行1的个数
int maxC = 0;//每一列1的个数
maxC = maxR;
int r = k%n;
if(r) ans = 2;
else ans = 0;
int R[maxn];
int C[maxn];
int a[maxn][maxn];
cout<<ans<<endl;
memset(R,0,sizeof(R));
memset(C,0,sizeof(C));
memset(a,0,sizeof(a));
//r = 2*r;
int t = 0;
//先每一行错开置1
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(R[i]<maxR&&C[(j+t)%n]<maxC)//每一行。列1的个数不能超过限制
{
a[i][(j+t)%n] = 1;//错开放
R[i]++;
C[(j+t)%n]++;
}
}
t++;//注意这里
}
//再在前r行,每一行一个1,空的位置,错开置1
if(r)
{
t = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][(j+t)%n]==0&&r)
{
a[i][(j+t)%n] = 1;
r--;
break;//一行只放一个
}
}
t++;
}
}
//输出
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
return 0;
}
收获:
如何给 矩阵错赋值