枚举。
枚举对角线上放多少个$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; }