P9837 汪了个汪
和 Jryno1 赛时独立想到了同一个做法,感觉比现在两篇官方题解都更可能被想到一些。
所有行列的编号取 0-index
,列从左往右,行从上到下。
观察样例。
仔细看那个 2211
, 的两侧有 , 左右侧有 。再看左下角那个 34
, 的左右有 和 , 的左右有 。
为了与后面的说明相符合,把它写成
1
3 2
5 2 4
4 1 5 3
2 1 3 4 5
的样子。
我们尝试逐列扩展,每次扩展两列。具体说,我们在第 列(列取 0-index
)放 和 ,使得加上之前放下的数字,所有包含 和 的数对都出现。
注意到对于 , 已经出现。因此,实际上需要新出现 个数对。
第 列有 个数字,左右两列加起来有 个数对,注意到左边那一行最上面那一个数字不能与这一行形成数对,因此,这三列能组成所有我们需要的数对。
考虑构造。
经过大量手玩(赛时将近 2h,写搜索可能会快一些),我们构造出了一个 的情况。
1
3 2
5 1 4
7 2 6 3
6 1 7 4 5
4 2 5 3 7 6
2 1 3 4 6 5 7
仔细观察它,偶数列是一段奇数拼一段偶数,奇数列是 与 交替。
对于偶数列,大的数字在中间,奇数在上的情况和偶数在上的情况交替。
对于奇数列,奇偶数交替,哪种数字在前也交替。
如果听不懂文字描述可以看一看 ,务必分奇偶列去看。
1
3 2
5 1 4
7 2 6 3
9 1 8 4 5
8 2 9 3 7 6
6 1 7 4 9 5 8
4 2 5 3 8 6 9 7
2 1 3 4 6 5 7 8 9
我都快忘了自己怎么想到的了,反正玩了很久后终于找到了那组解。
这是 为奇数,那偶数怎么办呢?
你发现斜线是一个排列,因此在每一行最后加一个 就行了。(谢谢 @Register_int)
代码
#include <bits/stdc++.h>
int main() {
int n; scanf("%d", &n);
std::vector<std::vector<int>> f(n, std::vector<int> (n));
bool q = 0;
if (n % 2 == 0) q = 1, --n;
for (int i = 0; i < n; i += 2) {
if (i % 4 == 0) {
int p = i;
for (int j = i + 1; j <= n; j += 2)
f[p++][i] = j;
p = n - 1;
for (int j = i + 2; j <= n; j += 2)
f[p--][i] = j;
} else {
int p = n - 1;
for (int j = i + 1; j <= n; j += 2)
f[p--][i] = j;
p = i;
for (int j = i + 2; j <= n; j += 2)
f[p++][i] = j;
}
}
for (int i = 1; i < n; i += 2) {
if (i % 4 == 1) {
std::vector<int> val(2);
val[0] = i, val[1] = i + 1;
for (int j = n - 1; j >= i; j--)
f[j][i] = val[(n - 1 - j) & 1];
} else {
std::vector<int> val(2);
val[0] = i + 1, val[1] = i;
for (int j = n - 1; j >= i; j--)
f[j][i] = val[(n - 1 - j) & 1];
}
}
if (q) printf("%d\n", n + 1);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) printf("%d ", f[i][j]);
if (q) printf("%d ", n + 1);
printf("\n");
}
}
作者:purplevine
出处:https://www.cnblogs.com/purplevine/p/17914823.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
本文来自博客园,作者:purplevine,转载请注明原文链接:https://www.cnblogs.com/purplevine/p/17914823.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现