牛客练习赛 106 D题题解

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值