D-01树-困难版本_牛客练习赛106 (nowcoder.com)
题目描述
注意,本题的简单版本与困难版本的区别在于,简单版本中 n 为偶数,要求 0 和 1 的数量相等,而困难版本中 n 为奇数,要求 0 和 1 的数量相差不超过 1。
现有一个 n×n的方格,保证 n 为奇数,初始时方格的每个格点都为空,你需要在方格的每个格点都填上 0、1 其中一个数字,然后考虑这样一张图:
- 方格中的每一个格点视为一个点。
- 两个数字相同的、以边相邻的方格之间视为存在一条边。
你需要构造一个填数方案并输出该 01 方格,满足:
1. 这张图中,所有 0 所在格点相互连通,但不能出现环;所有 1 所在格点相互连通,但不能出现环。
2. 方格中 0 的数量与方格中 1 的数量相差不超过1。
可以证明,对于任意合法的输入均保证有解。
输入描述:
第一行输入一个正整数 3≤n≤1000, 保证 n 为奇数。
输出描述:
输出一个 n 行,每行输出一个长度为 n 的 01 字符串。 第 i 行的字符串 si 的第 j 个元素 si,j 为 0/1 表示你构造的方格的第 i 行第 j 列为 0/1。 若有多组解,输出任意一组即可。 具体可参考样例输出。
示例1
输入
3
输出
111 010 000
备注:
在本题的简单版本(即本场 C 题)中给出了一些合法、不合法情况的说明,不再赘述。
用类似第二题的解法比较方便,最后特殊处理一下即可
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N];
int main()
{
int n;
cin >> n;
if(n==3)
cout<<"111"<<endl<<"101"<<endl<<"000";
else
{
for( int i = 1; i <= n; ++i )
a[ 1 ][ i ] = 1;
for( int i = 1; i < n; i += 2 )
for( int j = 2; j < n; ++j )
a[ j ][ i ] = 1;
for( int i = 4; i < n; i += 2 )
{
a[ i ][ n - 1 ] = 1;
a[ 2 ][ n ] = 1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<a[i][j];
cout<<endl;
}
}
return 0;
}