2022年第三届辽宁省大学生程序设计竞赛:M-画画

326 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第33天,点击查看活动详情

2022年第三届辽宁省大学生程序设计竞赛——M-画画

M-画画

题目描述

小筱是一个喜欢画画的女孩子。

小筱有一块画布,画布是一个N×N的网格。最先开始画布上的每个格子都是白色,小筱想要把一些格子涂黑,完成一幅黑白的画。由于小筱很喜欢黑色,所以她希望使得尽量多的格子变成黑色。同时她希望对于第i行/列上的黑色格子数量与i的奇偶性相同(行与列编号为[0...N−1]。

现在请你帮助小筱画出一幅符合要求的画,其中黑色用1表示,白色用0表示。

输入描述:

第一行输入为T(1≤T≤10),表示数据组数,
之后T行每行输入一个N(1≤N≤1000),表示画的大小。

输出描述:

T组数据每组数据一个N×N的01矩阵表示答案。                     

输入

1
2

输出

11
10

问题解析

注意题目说的,要求对于某列/行,他们的黑格子数的奇偶性与当前列/行的奇偶性相同。而且我们希望黑格子数尽量多。

那么,当n是偶数时,一行的格子数就是偶数,显然当偶数行的时候全涂成黑色,让奇数行的时候涂n-1个格子才能使黑格子尽量多,

因为奇数列的格子数也要是奇数,所以对于奇数行,我们可以选一个与之前选的都不同的奇数列位置留白,比如(1,1)(3,3)(5,5)这些位置留白。以此类推。

如果n为奇数,则奇数行的时候全涂成黑色,让偶数行的时候涂n-1个格子,也就是说对于偶数行,我们要选一个与之前选的都不同的偶数列位置留白,比如(0,0)(2,2)(4,4)这些位置留白。以此类推。

AC代码

void solve()
{
    int n;
    cin >> n;
    if(n%2==0)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(j==i&&j%2==1)cout<<0;
                else cout<<1;
            }
            cout<<endl;
        }
    }
    else 
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(j==i&&j%2==0)cout<<0;
                else cout<<1;
            }
            cout<<endl;
        }
    }
}