5 个版本 (3 个破坏性更新)
0.4.0 | 2024年4月27日 |
---|---|
0.3.1 | 2022年10月3日 |
0.3.0 | 2021年11月1日 |
0.2.0 | 2021年3月2日 |
0.1.0 | 2020年5月25日 |
#53 in 游戏
76KB
1.5K SLoC
苏多库根
数独谜题求解器和生成器库。
苏多库根可以使用基本策略和穷举法混合找到有效谜题的解决方案。它还可以生成新的最小谜题。这个库是我作为一个 Rust 学习项目构建的。
阅读文档并在 docs.rs/sudokugen 上探索该库
如何使用苏多库根
苏多库根提供了两个结构,用于解析、操作和显示数独棋盘和谜题。结构 Board 允许您从字符串解析棋盘,显示它并尝试解决它。结构 Puzzle 包含与新谜题相关的信息,初始棋盘及其解决方案。
您可以从字符串解析谜题
use sudokugen::Board;
let board: Board = "
. . . | 4 . . | 8 7 .
4 . 3 | . . . | . . .
2 . . | . . 3 | . . 9
---------------------
. . 6 | 2 . . | . . 7
. . . | 9 . 6 | . . .
3 . 9 | . 8 . | . . .
---------------------
. . . | . . . | . 4 .
8 7 2 | 5 . . | . . .
. . . | 7 2 . | 6 . .
".parse().unwrap();
解析后,您可以使用 Board::solve 函数解决它
board.solve().unwrap();
assert_eq!(
board,
"695412873413879526287653419146235987728946135359187264561398742872564391934721658"
.parse()
.unwrap()
);
最后,您可以使用 Puzzle::generate 生成新的谜题,在这样做时,您必须指定要生成哪种大小的谜题,BoardSize 可以使这变得非常简单。
use sudokugen::{Puzzle, BoardSize};
let puzzle = Puzzle::generate(BoardSize::NineByNine);
println!("Puzzle\n{}", puzzle.board());
println!("Solution\n{}", puzzle.solution());
这将打印出类似这样的内容
> Puzzle
> . . . . . . . 6 .
> . 1 7 . 4 . . 9 .
> . . . . 9 . 5 3 .
> . . 5 . 7 2 8 . .
> 1 . . . . 8 4 5 .
> . 4 . 9 . . . . .
> 8 7 9 1 2 . . . .
> 4 5 . 8 . . . . .
> . . . . . . . . .
>
> Solution
> 9 2 3 5 8 1 7 6 4
> 5 1 7 6 4 3 2 9 8
> 6 8 4 2 9 7 5 3 1
> 3 6 5 4 7 2 8 1 9
> 1 9 2 3 6 8 4 5 7
> 7 4 8 9 1 5 6 2 3
> 8 7 9 1 2 6 3 4 5
> 4 5 6 8 3 9 1 7 2
> 2 3 1 7 5 4 9 8 6
谜题质量
评估谜题超出了本库的范围。正确评估谜题需要像人类一样解决它们,而一些像人类一样解决谜题的更复杂技术需要进行大量的计算,这些计算并不总是从性能角度获得回报。
尽管如此,生成的谜题通常具有22到26个线索,这使得它们可能位于大多数可用谜题的较难一侧。
它是否快速?
简单回答是,这取决于你的使用场景。`Board::solve
` 函数针对 9x9 数独问题进行了优化,在我的 2017 年的 MacBook Pro 上,解决一个难题平均需要 300μs,这意味着每秒可以解决大约 3000 个难题。
`Puzzle::generate
` 函数的优化程度较低,并且大量使用了 `Board::solve
`,而没有尝试重用重复的计算,因此在我的基准测试中,生成一个新难题需要大约 18ms。
你可以使用 cargo bench
运行自己的基准测试。
依赖项
约 1.5MB
约 30K SLoC