1 条题解
-
0
自动搬运
来自洛谷,原作者为

Starlight237
[Drawer/auth]EgcqEzGZV+k435xMKiYIpABsjWY0ln/huv6DW7QW9Qw=搬运于
2025-08-24 22:26:32,当前版本为作者最后更新于2021-10-29 14:44:27,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
对于两个 数独谜题(不管是否有解),定义 和 等价当且仅当 可以通过下列操作进行若干次变换后成为 。
- 选择两个数字 ,将所有 变成 ,所有 变成 。
- 在 三个三元组中,选择两个,作为整体交换以它为下标的行。
- 选择在同一个三元组中的两个数 ,交换谜题的第 行和第 行。
- 在 三个三元组中,选择两个,作为整体交换以它为下标的列。
- 选择在同一个三元组中的两个数 ,交换谜题的第 列和第 列。
- 把 转置。
现在给定 个数独谜题,判断它们两两是否等价。若等价,还需要输出一种变换的方法。
D x y表示将两个数字交换,R a b表示整体交换三元组 对应的行,r a b表示交换两个行,同理有C a b和c a b作为列操作。F表示取转置。下面考虑如何比较两个数独 ,首先不考虑具体的数字,交换行的操作一共有 1296 种,交换列的操作也一共有 1296 种。 同时做行变换和列变换等价于 只做行变换, 只做列变换,因此可以把 做行变换的结果用 Hash 表存起来即可,然后枚举对 的列变换,看 是否在 Hash 表中出现过。类似 BSGS 算法的思想。
转置操作最多会进行一次,枚举是否转置即可。
由于任意两个数字可以交换,我们只需要设计一种对数值不敏感的 Hash,比如 ,或者异或等,其中 表示数字 在数独上出现的位置集合,可以用一个
unsigned int128压缩起来。若比较的时候发现两个 Hash 值不相等,那一定(在当前变换方法下)不等价,否则暴力比较两个 集合。具体实现可以用std::map,std::unordered_map等STL结构。 是一个单值 Hash 函数,可以随自己的喜好实现。
- 1
信息
- ID
- 6233
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者