持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}
}