数独求解器,不是回溯求解器

过去几周我一直在玩数独游戏。 游戏作为很多function,如:玩游戏,打印数独,解决数独。

解决function使用传统的回溯,但这不是问题,问题是我需要游戏能够产生一个人道可解的数独,因为我需要一个能够解决数据的方法,因为人类会做到这一点。

如果有人能帮助我找出如何做到这一点的机制,我将非常感激。

在安德鲁·斯图尔特的Sudoku页面上,很好地呈现并解释了压倒性的人类玩家数独解决策略集合:

**Show Possibles** 1: Hidden Singles 2: Naked Pairs/Triples 3: Hidden Pairs/Triples 4: Naked Quads 5: Pointing Pairs 6: Box/Line Reduction **Tough Strategies** 7: X-Wing 8: Simple Colouring 9: Y-Wing 10: Sword-Fish 11: XYZ Wing **Diabolical Strategies** 12: X-Cycles 13: XY-Chain 14: 3D Medusa 15: Jelly-Fish 16: Unique Rectangles 17: Extended Unique Rect. 18: Hidden Unique Rect's 19: WXYZ Wing 20: Aligned Pair Exclusion **Extreme Strategies** 21: Grouped X-Cycles 22: Empty Rectangles 23: Finned X-Wing 24: Finned Sword-Fish 25: Altern. Inference Chains 26: Sue-de-Coq 27: Digit Forcing Chains 28: Nishio Forcing Chains 29: Cell Forcing Chains 30: Unit Forcing Chains 31: Almost Locked Sets 32: Death Blossom 33: Pattern Overlay Method 34: Quad Forcing Chains **"Trial and Error"** 35: Bowman's Bingo 

作为一个相当频繁的球员,我会将战略11之外的所有事情都判断为“不再有趣”。 但那可能是品味问题。

如果你只需要一个快速的随机数独游戏,你可以使用一种特殊的方式来创建一个有效的数独模式,使用我刚才想到的以下算法:

 You initialize an array with a randomized set of the numbers 1 to 9, technically it's easier if you initialize 3 arrays each with 3 length. You can have these numbers be randomized, thus create a different sudoku. [1 2 3] [4 5 6] [7 8 9] Then you shift these: [7 8 9] [1 2 3] [4 5 6] [4 5 6] [7 8 9] [1 2 3] Then you shift the numbers inside the arrays: [3 1 2] [6 4 5] [9 7 8] Then you shift the arrays themselves again: [9 7 8] [3 1 2] [6 4 5] [6 4 5] [9 7 8] [3 1 2] Then you shift the numbers inside the arrays: [2 3 1] [5 6 4] [8 9 7] Then you shift the arrays again: [8 9 7] [2 3 1] [5 6 4] [5 6 4] [8 9 7] [2 3 1] 

你将拥有最终的数独表:

 [1 2 3] [4 5 6] [7 8 9] [7 8 9] [1 2 3] [4 5 6] [4 5 6] [7 8 9] [1 2 3] [3 1 2] [6 4 5] [9 7 8] [9 7 8] [3 1 2] [6 4 5] [6 4 5] [9 7 8] [3 1 2] [2 3 1] [5 6 4] [8 9 7] [8 9 7] [2 3 1] [5 6 4] [5 6 4] [8 9 7] [2 3 1] 

这是有效的。 之后,您可以取出一些数字,并且可以使用您已经拥有的算法进行检查,无论是单个解决方案还是多个解决方案。 如果删除某个数字会产生多个,则撤消它并结束删除,或尝试删除另一个。