草庐IT

go - 为什么我必须使用 core.CreateIntVarFromTo 才能让这个数独解算器工作?

我正在使用Golanggofd包来提供约束满足解决方案来解决数独问题。我创建以下内容packagemainimport("bitbucket.org/gofd/gofd/core""bitbucket.org/gofd/gofd/propagator""bitbucket.org/gofd/gofd/labeling""encoding/json""io/ioutil""fmt")varROWS=[]string{"A","B","C","D","E","F","G","H","I"}varCOLS=[]int{1,2,3,4,5,6,7,8,9}varSQUARE1=[]string

java - 构建高效的数独求解器

是的,我知道这不是什么新鲜事,已经有很多问题(它甚至有自己的标签),但我想用Java创建一个数独求解器,只是为了训练自己编写代码这样效率更高。在程序中执行此操作的最简单方法可能是使用大量for循环解析每一列和每一行,收集每个单元格的可能值,然后剔除只有一种可能性的单元格(无论它们是否只包含1数字,或者它们是其行/列中唯一包含此数字的单元格),直到您解决了难题。当然,光是想到这个Action就应该在每个程序员的脑海中竖起一面红旗。我正在寻找的是以最有效的方式解决这个问题的方法(请尽量不要包含太多代码-我想自己弄清楚这部分)。如果可能的话,我想避免使用数学算法-那些太简单了而且100%不是

java - 数独解算器错误

我不知道自己做错了什么,整天盯着这段代码看。这是Java中的“标准”数独解算器,它采用int[][],其中空白处为0。鉴于我只传递了一block有35个孔的板,这应该能够解决绝大多数问题,但只能解决~66%。在其他情况下,还剩下一些(通常是2或4个)空白,无法解决(即,不正确的数字已写入board。)几乎总是,它会是一个9个不见了。我明白这样一个简单的解决方案并不能解决所有的数独问题。我故意给它简单的。importjava.util.ArrayList;importjava.util.List;publicclassSudokuSolver{publicSudokuSolver(){i

java - 数独解法

我的数独解法有问题。该程序是这样工作的;开始时棋盘是空的,用户在棋盘上添加几个数字,然后点击“求解”按钮,程序会尝试求解。除了将相同的数字放在同一行之外,一切正常。因此,如果用户添加1,1,0,0...0。在拼图中,它无法解决它,因为它的两个1彼此相邻,并且将永远继续尝试找到一个sulotion,即使它无法解决谜。但是,如果它们都是0(空),它会立即解决它,就像我将1和2放在左上角一样。如果我只是在其中放入一些随机数,它将检测到它无法解决(或者如果它是一个有效的谜题,它将解决它)我在想这句话,当theNumber==(row,col)等于thenNumber==(row+1,col)时

java - 如何生成一个完整的数独板?算法错误

我正在尝试生成一个完整的(即每个单元格都填有一个数字)类数独棋盘。这是为了与数独无关的其他事情,所以我对达到可以解决的白色方block的数独或任何与数独有关的事情不感兴趣。不知道你明白我的意思吗。我用java做了这个:privateintsudokuNumberSelector(intx,inty,int[][]sudoku){booleanvalid=true;StringvalidNumbers=newString();int[]aValidNumbers;intsquarexstart=0;intsquareystart=0;intb=0;//ForrandomnumbersRa

Acwing166 数独题解 - DFS剪枝优化

166.数独-AcWing题库题意数独是一种传统益智游戏,你需要把一个9×9的数独补充完整,使得数独中每行、每列、每个3×3的九宫格内数字1∼9均恰好出现一次。请编写一个程序填写数独。思路搜索+剪枝(优化搜索顺序、位运算)优化搜索顺序:很明显,我们肯定是从当前能填合法数字最少的位置开始填数字位运算:很明显这里面check判定很多,我们必须优化这个check,所以我们可以对于,每一行,每一列,每一个九宫格,都利用一个九位二进制数保存,当前还有哪些数字可以填写.lowbit:我们这道题目当前得需要用lowbit运算取出当前可以能填的数字.code+详细注释#include#definelowbit

c++ - 数独递归回溯,反递归太早

所以我正在用C++编写数独解算器,但遇到了一些小问题。下面是我的解决板代码。它适用于拼图的前3行,但在到达第4行末尾时不再递归。查看gdb上的代码,它到达第4行的末尾,回溯到第6列,尝试然后反递归到最后。关于代码的其他一些注意事项是保存数独板的矩阵从1,1而不是0,0开始。因此,当最初调用solveBoard时,参数为(1,1,0)。我还附上了setCell和checkConflicts函数以获得更多信息。我有三个vectorrowConf、colConf和squConf来存储已经放置在相应行、列或正方形中的值。我已经在这几个小时了,无法让它超过第三排。非常感谢任何帮助。谢谢!编辑:添

c++ - 我的数独解算器功能有什么问题?

好的,所以我将函数更改为回溯函数(这是我在网上找到的)。它仍然从一个文件中读取并将其输入到一个数组中,检查功能正常工作,所以我没有改变它。如果您想知道以下是我正在尝试解决的难题(其中零是空格)。050020070720403000900050620005086000100040008000230400093010002000302046080000010//backtrackingfunctionvoidSudoku::solvePuzzle(){intx=0;inty=0;intr=0;boolback_flag;while(r=9){arr[x][y]=0;}}if(back_fl

C++:数独(抄板)

我是c++的新手,在做作业(数独)时遇到了问题。说明说:“你必须创建一个新板作为当前板的拷贝(使用复制构造函数并使用new)从堆中分配板。”我试过了(写在board.cc中):#include"board.h"//Searchforasolution,returnsNULLifnosolutionfoundBoard*Board::search(void){Boardb=newBoard(&this);...returnb;}收到错误消息:lvaluerequiredasunary'&'operand.我也试过:Board*Board::search(void){Boardb;Boar

c++ - 数独求解算法C++

这几天我一直在尝试制作一个数独求解程序,但我坚持使用这些方法。我在这里找到了这个算法,但我不太明白:startatthefirstemptycell,andput1init.Checktheentireboard,andseeifthereareanyconflictsIftherearecoflictsontheboard,increasethenumberinthecurrentcellby1(sochange1to2,2to3,etc)Iftheboardiscleanmove,startatsteponeagain.Ifallninepossiblenumbersonagive