枚举。
枚举对角线上放多少个$1$,剩余的贪心放,更新答案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
int n,k;
int a[110][110];
int b[110][110];
void ok()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]!=b[i][j])
{
if(a[i][j]>b[i][j])
{
for(int ii=1;ii<=n;ii++)
{
for(int jj=1;jj<=n;jj++)
{
b[ii][jj] = a[ii][jj];
}
}
}
return ;
}
}
}
}
int main()
{
scanf("%d%d",&n,&k);
if(n*n<k)
{
printf("-1
");
return 0;
}
int suc = 0;
for(int x=0;x<=n;x++)
{
memset(a,0,sizeof a);
if(x>k) continue;
if((k-x)%2!=0) continue;
if( n*n - n < k-x ) continue;
for(int i=1;i<=x;i++) a[i][i] = 1;
int sum = 0;
if((k-x)!=0)
{
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
a[i][j] = a[j][i]=1;
sum+=2;
if(sum == k-x) break;
}
if(sum == k-x) break;
}
}
if(sum == k-x) suc=1;
ok();
}
if(suc==0) printf("-1
");
else
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d",b[i][j]);
if(j<n) printf(" ");
else printf("
");
}
}
}
return 0;
}