Javascript 递归数独算法工作正常,但返回错误

Javascript 递归数独算法工作正常,但返回错误,javascript,algorithm,recursion,sudoku,Javascript,Algorithm,Recursion,Sudoku,很抱歉下面的代码转储 此算法确实解决了数独难题(如登录solve if empty==-1 func),但一旦所有递归展开,实际输出要么返回原始的难题字符串,要么返回默认情况下的{error:'puzzle cannot solved'} 我认为这可能是最后一个迭代错误,但我已经进行了重构和重组,直到我脸色发青,不明白为什么它在展开时没有返回成功的输出 任何帮助都将不胜感激 SudokuSolver类{ 验证(字符串){ //console.log(拼图字符串) if(puzzleString

很抱歉下面的代码转储

此算法确实解决了数独难题(如登录solve if empty==-1 func),但一旦所有递归展开,实际输出要么返回原始的难题字符串,要么返回默认情况下的{error:'puzzle cannot solved'}

我认为这可能是最后一个迭代错误,但我已经进行了重构和重组,直到我脸色发青,不明白为什么它在展开时没有返回成功的输出

任何帮助都将不胜感激

SudokuSolver类{
验证(字符串){
//console.log(拼图字符串)
if(puzzleString.length==0){
返回{
错误:“缺少必需字段”
}
}
如果(字串长度!==81){
返回{
错误:“预计拼图长度为81个字符”
}
}
如果(!/^[0-9.]*$/.test(拼图字符串)){
返回{
错误:“拼图中的无效字符”
};
}
返回真值
}
createBoard(拼图字符串){
//在第0次或第9次迭代中创建新行
让拼图板=[
[],
[],
[],
[],
[],
[],
[],
[],
[]
]
让puzzle=puzzstring.split(“”);
设row=-1
for(设i=0;iA=0,1=0
res.push(input.toUpperCase().charCodeAt(0)-65)
res.push(parseInt(input.charAt(1))-1)
返回res
}
检查位置(字符串、坐标、值){
如果(!拼图字符串| |!坐标| |!值){
返回{
错误:“缺少必需字段”
}
}
if(this.validate(拼图字符串)!=true){
返回此。验证(拼图字符串)
};
让coordSplit=坐标分割(“”)
如果(!/[A-Ia-i]/.test(coordSplit[0]|!/[0-9]/.test(coordSplit[1])){
返回{
错误:“无效坐标”
}
};
如果(值<1 | |值>9 | | isNaN(值)){
返回{
错误:“无效值”
}
}
设boardCoords=this.coordToBoard(坐标)
//console.log(“boardCoords:+boardCoords”)
let board=this.createBoard(拼图字符串)
//控制台日志(板)
让冲突=[]
if(此.checkRowPlacement(board,boardCoords[0],boardCoords[1],value).valid!=true){
冲突.push(此.checkRowPlacement(board,boardCoords[0],boardCoords[1],value).conflict)
}
if(this.checkColPlacement(board,boardCoords[0],boardCoords[1],value).valid!=true){
conflicts.push(this.checkColPlacement(board,boardCoords[0],boardCoords[1],value).conflict)
}
if(this.checkRegionPlacement(board,boardCoords[0],boardCoords[1],value).valid!=true){
冲突.推送(此.checkRegionPlacement(board,boardCoords[0],boardCoords[1],value).conflict)
}
//如果值与当前坐标相同,则为空,并检查是否有效,如果有效,则返回true
if(板[boardCoords[0]][boardCoords[1]]==值){
董事会[boardCoords[0]][boardCoords[1]]='.'
if(this.checkRegionPlacement(board,boardCoords[0],boardCoords[1],value)。valid==true和this.checkColPlacement(board,boardCoords[0],boardCoords[1],value)。valid==true和this.checkRowPlacement(board,boardCoords[0],boardCoords[1],value)。valid==true){
返回{
有效:正确
}
}
}
if(this.checkRegionPlacement(board,boardCoords[0],boardCoords[1],value).valid!=true | this.checkColPlacement(board,boardCoords[0],boardCoords[1],value).valid!=true | this.checkRowPlacement(board,boardCoords[0],boardCoords[1],value).valid!=true){
返回{
有效:假,
冲突:冲突
}
}
返回{
有效:正确
}
}
if (!this.solve((puzzleString.substr(0, empty) + num + puzzleString.substr(empty + 1))).error) {
  console.log('no error: ' + puzzleString)
  return {solution: puzzleString} // Wrong. This is not the solution, but the unfinished puzzle.
}
let result = this.solve((puzzleString.substr(0, empty) + num + puzzleString.substr(empty + 1)));
if (!result.error) {
    console.log('no error: ' + puzzleString)
    return result; // Return what you got from the recursive call (the solution)
}