E题 | 01矩阵

解题思路:

首先不考虑连通块数量的限制,考虑最简单的构造方法,每行每列 的数量递增:

alt

我们发现 对应的行和列已经确定:

alt

随后我们发现 对应的行和列已经确定:

alt

随后我们又发现 对应的行和列已经确定:

alt

发现规律了吗?确定了每行、每列的和后,矩阵就唯一确定了:

alt

对于矩阵,交换任意两行或任意两列后,只会交换对应行或列的和,而不产生新的数字。

现在,我们要通过若干次交换保证连通块数量为 。我们可以将第 行和第 行交换、第 列和第 列交换,这样可以使前两行和前两列刚好包含 个连通块。

alt

可以理解为:选中的第 行和第 列构成了一条由 组成的隔离带,阻止了第 行上方和第 列左侧的 和内侧的 连通。同理我们构造出一个 组成的隔离带,把上一个 组成的隔离带隔离,就可以保证每次增加 个连通块。而现在第 行和第 列刚好就是这个隔离带,因此将其和第 行列交换:

alt

你会发现每次你都能找到这样的隔离带,最终一定可以构造出这样的矩阵:

alt

这个矩阵包含 个连通块,且任意一点 的值仅由 的奇偶性决定。

示例代码:

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