创建数独板的蛮力算法我正在开发的是,最初整个数独板是空的。其中一个随机单元格(81个)中填充了随机值(1-9)。现在我想用蛮力法填充所有剩余的单元格。谷歌搜索后我了解到,我们应该从第一个单元格开始,用1填充它(如果有效),然后用2填充第二个单元格(如果有效,我们将开始检查大于最后一个填充的单元格,在本例中为1,一旦达到9,我们将其重置为1)。问题是它不能正常工作!任何人都可以将我链接到确切的算法。我最近在我的博客上做了一个关于在C#中创建数独解算器的系列文章;您可以根据您的目的调整我提供的简单回溯算法。http://blogs.msdn.com/b/ericlippert/archive/tags/graph+colouring/这里是traceback方法的实现:importjava.util.Random;公共类数独{publicstaticvoidmain(String[]args){Randomrand=newRandom();intr=rand.nextInt(9);intc=rand.nextInt(9);int值=rand.nextInt(9)+1;董事会董事会=新董事会();棋盘.set(r,c,value);System.out.println(板);解决(板,0);System.out.println(板);}privatestaticbooleansolve(Boardboard,intat){if(at==9*9)returntrue;整数r=在/9;intc=%9;如果(board.isSet(r,c))returnsolve(board,at+1);for(intvalue=1;valueAlgorithmicsofMathematics上列出了一些算法。你描述的听起来像回溯法。看看下面。请注意,我没有运行它,所以我不能保证它的声明:http://www.codeproject.com/KB/game/SudokuGen.aspx代码在VB.NET中,但算法是相同的在C#中。这里有一个C#版本:http://www.codeproject.com/KB/game/sudokuincsharp.aspx@BilltheLizard提供的链接解释得很好,而不是我上面提供的实现链接。我使用了一种没有回溯的方法,尽管可能是while循环。引用一本算法书我读到“递归中没有什么是不能用迭代重复的”。我一直在用眼睛检查这个,因为即使对递归有相对的理解,我也无法完全理解递归方法:这个方法,我有点直接,在网格检查器中有一个错误,当我找到它,它现在似乎正在工作。我找到它是因为很难找到完整且有效的代码。iOS开发工具包。#defineWIDTH9#defineHEIGHT9@interfaceViewController()//-(BOOL)numberConflicts:(int)testNum;-(BOOL)number:(int)nconflictsWithRow:(int)r;-(BOOL)number:(int)nconflictsWithColumn:(int)c;-(BOOL)number:(int)nconflictsWithSquareInPointX:(int)xandPointY:(int)y;-(BOOL)number:(int)nconflictsAtGridPointX:(int)xPointandPointY:(int)yPoint;-(int)incrementSudokuValue:(int)v;@endstaticint数独[宽度][高度];@implementationViewController-(void)viewDidLoad{[superviewDidLoad];///Initializeitfor(intx=0;x10){//重启列tries=0;for(intcount=0;count注意:头文件为空,如果需要,您可以将其粘贴到您的iOS单视图应用程序中。注意:可能会无限循环(上面有时会,但速度非常快),可能需要另一个更全局的“try”变量,并为了安全起见重新启动算法,或者给它一个种子/同时进行两次编辑:如果源网格是可解的(或不存在的),以下对于无限循环应该是安全的#defineWIDTH9#defineHEIGHT9@interfaceViewController()//-(BOOL)numberConflicts:(int)testNum;-(BOOL)number:(int)nconflictsWithRow:(int)r;-(BOOL)number:(int)nconflictsWithColumn:(int)c;-(BOOL)number:(int)nconflictsWithSquareInPointX:(int)xandPointY:(int)y;-(BOOL)number:(int)nconflictsAtGridPointX:(int)xPointandPointY:(int)yPoint;-(int)incrementSudokuValue:(int)v;@endstaticint数独[宽度][高度];@implementationViewController-(BOOL)fillGridWithNext:(int)next;{for(inty=0;yIntro:第一个版本有缺陷,但(大部分)完成了工作。它随机生成每一行,如果该行无效,它会擦除??并重新开始。这将消除源网格并且可以永远消失,但大部分时间都有效。较低的代码使用递归。我不认为它回溯正确,但它解决了我的测试和半种子网格中的空值。我想我需要保存一个用于回溯的“状态”网格,但我没有这样做。我发布所有内容是因为他们都回答了“蛮力”......我自己,我应该研究递归,我无法解释为什么较低的工作,我个人可以帮忙。注意:第一个将在眨眼间完成...如果速度意味着比应用程序更可靠(在这种情况下有点违反直觉,无限循环,呵呵)。这个简单的随机游走算法也应该有效(但效率低下-使用风险自负!!!):编辑:-为无法解决的解决方案添加了修复。对于网格数组中的每个空单元格=Get_Legal_Numbers_for_cell(row,col);如果(数组为空){Clear_All_cells()}else{number=Random_number_from(array);Put_Number_in_Cell(数字);出于这种兴趣,描述了一种使用基于随机搜索来解决数独问题的方法。以上就是C#学习教程:暴力算法制作数独板分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注---本文收集自网络,不代表侵权,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处:
