PicSol 1.0.0.8

dotnet add package PicSol --version 1.0.0.8                
NuGet\Install-Package PicSol -Version 1.0.0.8                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="PicSol" Version="1.0.0.8" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用包。
paket add PicSol --version 1.0.0.8                
#r "nuget: PicSol, 1.0.0.8"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中以引用包。
// 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 PicSol

这是用于 .net Standard 2.0/.net Framework 4 端的 Nonogram 求解器库。
Nonograms 也可以称为“图片填空”、“Picross”或“Griddlers”。

用法

要尝试解决一个 Nonogram,您可以调用一个包含 NonogramSolver.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包含精确的结果,而IsSolvedResult == 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.ConsolePicSol.Tests项目。

注意事项/已知问题

解算器正在使用相当原始的方法,创建了大量的数据(例如,“慢速无法解决”示例创建了约460万个可能性,并使用了大约500 MB的内存)。

然而,即使更大的尼格罗方格也应该在合理的时间内解决,但是,建议你传递超时或你自己的CancellationTokenSource,以防止过程执行时间过长。

有一些优化可以减少所需的内存和CPU,但尼格罗方格是NP完备的,因此没有保证的方法来限制解决问题所需的时间和内存。

尽管如此,仍然可以进行更多的优化。

变更日志

1.0.0 (2017-11-11)

  • 初始发布

许可证

http://mstum.mit-license.org/

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 标准库
  • .NET Framework 4.0

    • 无依赖项。
  • .NETStandard 2.0

    • 无依赖项。

NuGet 包

此包未由任何 NuGet 包使用。

GitHub 存储库

此包未由任何流行的 GitHub 存储库使用。

版本 下载 最后更新
1.0.0.8 1,100 11/11/2017