PicSol 1.0.0.8
dotnet add package PicSol --version 1.0.0.8
NuGet\Install-Package PicSol -Version 1.0.0.8
<PackageReference Include="PicSol" Version="1.0.0.8" />
paket add PicSol --version 1.0.0.8
#r "nuget: PicSol, 1.0.0.8"
// Install PicSol as a Cake Addin #addin nuget:?package=PicSol&version=1.0.0.8 // Install PicSol as a Cake Tool #tool nuget:?package=PicSol&version=1.0.0.8
PicSol
这是用于 .net Standard 2.0/.net Framework 4 端的 Nonogram 求解器库。
Nonograms 也可以称为“图片填空”、“Picross”或“Griddlers”。
用法
要尝试解决一个 Nonogram,您可以调用一个包含 Nonogram
的 Solver.Solve
,然后返回一个 Solution
。
如果您想限制求解器尝试解决它的时间(大型 Nonogram 可能会花费很长时间),您可以传递一个 TimeSpan。
如果您想自己终止求解过程,您可以传递一个 CancellationTokenSource
并在需要时调用其上的 Cancel
。
请注意,如果您还设置了 Timeout,求解器将在 CancellationTokenSource
上调用 Cancel
- 如果您不希望这样做,请传递 null
作为超时值。
默认情况下,求解器会尝试使用所有 CPU 核心并将工作并行化。如果您不希望这样做,请将 false
传递给 useMultipleCores 参数。
定义 Nonogram
Nonogram
类有一个构造函数,它接受名称、行和列的数量以及行和列的提示。提示是显示在网格侧面的数字。
您可以选择创建 HintCollection
,或传递一个字符串。
如果你传递一个字符串,使用空格分隔单个元素,使用逗号分隔同一元素的帮助信息。
对于列,数字从上到下。
对于行,数字从左到右。
例如,"3 1,1 3 4,1,2"
描述了4个元素(行或列)。
第一个元素有3
个连续的单元格被填充。
第二个元素有两个组,每个组有1
个填充单元格,彼此之间至少有一个空单元格。
第三个元素有3
个连续的单元格被填充。
第四个元素有一个包含4
个填充单元格的组,然后至少一个空单元格,然后是第二个包含1
个填充单元格的组,至少一个空单元格,最后是一个包含2
个填充单元格的组。
例如,一些定义及其(未解决的)尼格罗方格
new Nonogram("Chair", 5, 5, "3 3 5 1,1,1 1,1,1", "5 3 5 1 3");
// 5 3 5 1 3
// --------------
// 3| ? ? ? ? ?
// 3| ? ? ? ? ?
// 5| ? ? ? ? ?
// 1 1 1| ? ? ? ? ?
// 1 1 1| ? ? ? ? ?
new Nonogram("Four Rows, Five Columns", 4, 5, "2 1,1 4 1", "2 1,1 1,2 2 0");
// 2 1 1 2 0
// 1 1
// ---------------
// 2| ? ? ? ? ?
// 1 1| ? ? ? ? ?
// 4| ? ? ? ? ?
// 1| ? ? ? ? ?
// This Nonogram is invalid and unsolvable
new Nonogram("Unsolvable", 2, 2, "2 1", "1 1");
// 1 1
// ----
// 2| ? ?
// 1| ? ?
// This uses 2D arrays as hints, and is the same as the Four Rows, Five Columns example above.
var rowHints = new int[4][] { new int[] { 2 }, new int[] { 1, 1 }, new int[] { 4 }, new int[] { 1 } };
var colHints = new int[5][] {
new int[] { 2 }, new int[] { 1, 1 }, new int[] { 1, 2 }, new int[] { 2 }, new int[] { 0 }
};
new Nonogram("Four Rows, Five Columns", 4, 5, HintCollection.From2DArray(rowHints),
HintCollection.From2DArray(colHints));
// You can also create a HintCollection from a string ahead of time
var rowHints = HintCollection.FromString("2 1,1 4 1");
var colHints = HintCollection.FromString("2 1,1 1,2 2 0");
new Nonogram("Four Rows, Five Columns", 4, 5, rowHints, colHints);
解
Solution
类是解决尼格罗方格的尝试的结果,无论是否成功。
Nonogram
是尝试解决的尼格罗方格,包含原始的行和列提示(顶/侧的数字)。
SolverState
是解算器使用的内部状态。你可以在这里获取一些性能信息(例如,生成了多少排列)。
Result
包含精确的结果,而IsSolved
是Result == SolveResult.Success
的快捷方式。可能的结果
- 成功 - 解算器解决了尼格罗方格。万岁!
- 无法解决 - 解算器遇到了无法解决的问题 - 尼格罗方格无效。(见上方示例)
- 已取消 - 解算器解决尼格罗方格耗时过长(达到超时),或你调用了传递给CancellationTokenSource的Cancel。请注意,已取消的状态并不会告诉你尼格罗方格是否有效。
Tiles
包含实际的单元格,是一个二维的bool集合,其中true
表示单元格被填充。
请注意,即使IsSolved
为false,Tiles也可能包含数据(在这种情况下,解算器放弃前的最后一个内部状态)。
这可以用来调试尼格罗方格为何无法解决。
你可以迭代行和列
for (int row = 0; row < solution.RowCount; row++)
{
for (int col = 0; col < solution.ColumnCount; col++)
{
var isFilled = solution.Tiles[row, col];
// You now know if the cell at 0-based coordinate row/col is filled or not
}
}
示例
要查看更详细的示例,请查看包含示例尼格罗方格和字符串渲染器的PicSol.Console
和PicSol.Tests
项目。
注意事项/已知问题
解算器正在使用相当原始的方法,创建了大量的数据(例如,“慢速无法解决”示例创建了约460万个可能性,并使用了大约500 MB的内存)。
然而,即使更大的尼格罗方格也应该在合理的时间内解决,但是,建议你传递超时或你自己的CancellationTokenSource,以防止过程执行时间过长。
有一些优化可以减少所需的内存和CPU,但尼格罗方格是NP完备的,因此没有保证的方法来限制解决问题所需的时间和内存。
尽管如此,仍然可以进行更多的优化。
变更日志
1.0.0 (2017-11-11)
- 初始发布
许可证
MIT许可证(MIT)
版权所有(c)2017 Michael Stum,http://www.Stum.de <opensource@stum.de>
以下是对任何获得此软件及其相关文档文件(“软件”)副本的个人(“个人”)的免费许可,允许在不加限制的情况下处理该软件,包括但不限于以下权利:使用、复制、修改、合并、发布、分发、再许可及/或出售软件副本,以及允许收到软件的个人这样做,前提是必须遵守以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何保证,无论是明示的还是隐含的,包括但不限于适销性、特定目的适用性和非侵权性。在任何情况下,都不会因软件或其使用、或与之相关的任何行为导致或引起的任何索赔、损害或其他责任(无论是在合同之诉、侵权之诉或其他诉讼)而承担任何责任。
产品 | 版本 兼容的附加计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET 框架 | net40 兼容。 net403 已计算。 net45 已计算。 net451 已计算。 net452 已计算。 net46 已计算。 net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NET Framework 4.0
- 无依赖项。
-
.NETStandard 2.0
- 无依赖项。
NuGet 包
此包未由任何 NuGet 包使用。
GitHub 存储库
此包未由任何流行的 GitHub 存储库使用。
版本 | 下载 | 最后更新 |
---|---|---|
1.0.0.8 | 1,100 | 11/11/2017 |