E题 | 01矩阵
解题思路:
首先不考虑连通块数量的限制,考虑最简单的构造方法,每行每列 的数量递增:
我们发现 对应的行和列已经确定:
随后我们发现 对应的行和列已经确定:
随后我们又发现 对应的行和列已经确定:
发现规律了吗?确定了每行、每列的和后,矩阵就唯一确定了:
对于矩阵,交换任意两行或任意两列后,只会交换对应行或列的和,而不产生新的数字。
现在,我们要通过若干次交换保证连通块数量为 。我们可以将第
行和第
行交换、第
列和第
列交换,这样可以使前两行和前两列刚好包含
个连通块。
可以理解为:选中的第 行和第
列构成了一条由
组成的隔离带,阻止了第
行上方和第
列左侧的
和内侧的
连通。同理我们构造出一个
组成的隔离带,把上一个
组成的隔离带隔离,就可以保证每次增加
个连通块。而现在第
行和第
列刚好就是这个隔离带,因此将其和第
行列交换:
你会发现每次你都能找到这样的隔离带,最终一定可以构造出这样的矩阵:
这个矩阵包含 个连通块,且任意一点
的值仅由
的奇偶性决定。
示例代码:
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j)
cout << (min(i, j) & 1);
cout << '\n';
}
}

京公网安备 11010502036488号