程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了这个数独回溯递归算法是如何触发回溯的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决这个数独回溯递归算法是如何触发回溯的??

开发过程中遇到这个数独回溯递归算法是如何触发回溯的?的问题如何解决?下面主要结合日常开发的经验,给出你关于这个数独回溯递归算法是如何触发回溯的?的解决方法建议,希望对你解决这个数独回溯递归算法是如何触发回溯的?有所启发或帮助;
let row = this.findEmpty(puzzleString)[0];
let col = this.findEmpty(puzzleString)[1];
let i = this.findEmpty(puzzleString)[2];

if(!this.findEmpty(puzzleString)) return puzzleString
for(let num = 1; num < 10; num++){
  if(this.checkValue(puzzleString,row,col,num)){
    puzzleString[i] = num;
    this.solve(puzzleString)
  } 
}

findEmpty(puzzleString) 遍历拼图字符串并返回空白网格的行 (A-I)、列 (1-9) 和索引。 checkValue() 包含 3 个辅助函数,返回一个布尔值,确保行、列或区域之间没有冲突。

循环从 1-9 开始迭代,第一个通过 checkValue() 的 1-9 值被分配给当前的空白网格,然后通过调用父函数 solve() 触发递归。

我不明白下一个语句以及它如何触发回溯

if(this.findEmpty(puzzleString)){ 
  puzzleString[i] = '.';
}

如果当前被检查的空白网格没有解决方案,那么我认为网格仍然是空白的 ('.')。如果这是正确的,为什么需要这种说法?这个语句会触发回溯吗?

我最初的倾向是这个语句是一个伪else语句,只有在循环无法找到解决方案时才运行。它必须被放置在循环之外以允许从 1 到 9 的完整迭代。但是如果 solve() 仅在 solve() 时被调用,那么代码如何知道之后运行 checkValue()成功了吗?

完整代码如下:

solve(puzzleString) {
let row = this.findEmpty(puzzleString)[0];
let col = this.findEmpty(puzzleString)[1];
let i = this.findEmpty(puzzleString)[2];

if(!this.findEmpty(puzzleString)) return puzzleString
for(let num = 1; num < 10; num++){
  if(this.checkValue(puzzleString,num)){
    puzzleString[i] = num;
    this.solve(puzzleString)
  } 
}
if(this.findEmpty(puzzleString)){ 
  puzzleString[i] = '.';
} 

if(puzzleString.includes('.')) return { error: 'Puzzle cAnnot be solved' } 

return {
  solution: puzzleString.join('')
  }

}

findEmpty(puzzleString){
    for(let i = 0; i < puzzleString.length; i++){
      if(puzzleString[i] == '.'){
        let row = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
        let col = (i % 9) + 1;
        return [row,i];
      }
    } 
    return false;
  }

  checkValue(puzzleString,column,value){
    if(this.checkRowPlacement(puzzleString,value)&&
    this.checkColPlacement(puzzleString,value)&&
    this.checkRegionPlacement(puzzleString,value)){
      return true;
    }
    return false;
  }
checkRowPlacement(puzzleString,value) {

    let coordinates = [];
    let rowLetter;
    let colNum;
    let temp = [];
    if(row){row = row.toupperCase();}
    for(let i = 0; i < puzzleString.length; i++){
      rowLetter = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
      colNum = (i % 9) + 1;
      coordinates.push(rowLetter + colNum);
    } 
    for(let i = 0; i < coordinates.length; i++){
        if(coordinates[i][0] == row){
            temp.push(puzzleString[i]);
        }
    } 
    temp = temp.join('');
    return !temp.includes(value) ? true : false
    
  }

  checkColPlacement(puzzleString,value) {
    let coordinates = [];
    let rowLetter;
    let colNum;
    let temp = [];
    if(row){row = row.toupperCase();}
    for(let i = 0; i < puzzleString.length; i++){
      rowLetter = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
      colNum = (i % 9) + 1;
      coordinates.push(rowLetter + colNum);
    } 
    for(let i = 0; i < coordinates.length; i++){
        if(coordinates[i][1] == column){
            temp.push(puzzleString[i]);
        }
    } 
    temp = temp.join('');
    return !temp.includes(value) ? true : false
  }

  checkRegionPlacement(puzzleString,value) {
    let coordinates = [];
    let rowLetter;
    let colNum;
    let regions = [];
    if(row) row = row.toupperCase();

    for(let i = 0; i < puzzleString.length; i++){
      rowLetter = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
      colNum = (i % 9) + 1;
      coordinates.push(rowLetter + colNum);
    }

    for(let i = 0; i < coordinates.length; i+=27){
      for(let k = 0; k < 9; k+=3){
        regions.push(
          coordinates.slice(i+k,i+k+3) + ',' +
          coordinates.slice(i+k+9,i+k+12) + ',' +
          coordinates.slice(i+k+18,i+k+21)
        )
      }
    }

    let region = regions.filter(x => x.includes(row + column))[0].split(',').map(x => puzzleString[coordinates.indexOf(X)]).join('');

    return region.includes(value) ? false : true;
  }

解决方法

回溯发生在 findEmtpy 返回 false 时。但是由于您的代码不是最优的,在回溯时仍然尝试了许多其他选项:递归树中未决的 for 循环都没有被中断,但是让它们继续并调用 {{1 }} 因为这些调用中的每一个现在都将返回 checkValue。因此,最终所有这false 循环都将结束,递归将回溯,只是为了完成另一个循环并再次回溯,等等。

这是您的主要功能的更新,以避免一些导致没有收益的开销:

for

大佬总结

以上是大佬教程为你收集整理的这个数独回溯递归算法是如何触发回溯的?全部内容,希望文章能够帮你解决这个数独回溯递归算法是如何触发回溯的?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: