题目

思路:

若有错误的地方请指正。若读者不理解,欢迎提问

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;
}

收获:

如何给 矩阵错赋值