D

题目链接:https://codeforces.com/contest/1371/problem/D

思路: 模拟一下在矩阵中挨个放1的过程,放的时候,每次斜着放n个,如果放不下了就放对角,画个图演示一下。

如图,放完9之后,把10放到右上角。 13之后,把14,15也放到右上角。 每次都放n个,左下的区域放不下了再放到右上的区域里,模拟一下这个过程。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
int n,m;
int a[305][305];
int main ()
{
    int T,i,t,j,k,p,sum=0;
    cin>>T;
    while (T--)
    {
        memset(a,0,sizeof(a));
        cin>>n>>k;
        t=1;
        while (k)
        {
            for(i=t;i<=n;++i){  //放置左下的区域 
                if(a[i][i-t+1]==0 &&k)
                    a[i][i-t+1]=1,k--;
            }
            for(j=1;j<t;++j) //放置右上角的区域
                if(a[j][n-t+j+1]==0 &&k)
                    a[j][n-t+j+1]=1,k--;
            t++;
        }
for(i=1;i<=n;++i) for(j=1;j<=n;++j) a[0][j]+=a[i][j],a[i][0]+=a[i][j]; //计算行与列的和

int rmax=0,rmin=n,cmax=0,cmin=n; for(i=1;i<=n;++i) //找出最大值和最小值 rmax=max(rmax,a[0][i]),rmin=min(rmin,a[0][i]), cmax=max(cmax,a[i][0]),cmin=min(cmin,a[i][0]);
sum
=(rmax-rmin)*(rmax-rmin)+(cmax-cmin)*(cmax-cmin); cout<<sum<<endl; for(i=1;i<=n;++i){ for(j=1;j<=n;++j) cout<<a[i][j]; cout<<endl; } } return 0; }
原文地址:https://www.cnblogs.com/blowhail/p/13223988.html