Javascript 试图解决N Rook问题时遇到问题。总是得到n*n解,而不是n阶乘

Javascript 试图解决N Rook问题时遇到问题。总是得到n*n解,而不是n阶乘,javascript,Javascript,我试图找到解决N车问题的N种方法。我现在遇到的问题是,我似乎得到了n*n个解决方案,而它需要n。下面是我的代码,我用简单的循环和函数编写了它,所以它相当长。任何帮助都将不胜感激 注:请忽略n=2的情况。我得到了一些我认为可以通过JSON.stringify处理的副本 var createMatrix = function (n) { var newMatrix = new Array(n); // build matrix for (var i = 0; i <

我试图找到解决N车问题的N种方法。我现在遇到的问题是,我似乎得到了n*n个解决方案,而它需要n。下面是我的代码,我用简单的循环和函数编写了它,所以它相当长。任何帮助都将不胜感激

注:请忽略n=2的情况。我得到了一些我认为可以通过JSON.stringify处理的副本

var createMatrix = function (n) {
    var newMatrix = new Array(n);

    // build matrix
    for (var i = 0; i < n; i++) {
      newMatrix[i] = new Array(n);
    }

    for (var i = 0; i < n; i++) {
      for (var j = 0; j < n; j++) {
        newMatrix[i][j] = 0;
      }
    }

    return newMatrix;
  };

  var newMatrix = createMatrix(n);

  // based on rook position, greying out function 
  var collision = function (i, j) {
    var col = i;
    var row = j;

    while (col < n) {
      // set the row (i) to all 'a'
      col++;
      if (col < n) {
        if (newMatrix[col][j] !== 1) {
          newMatrix[col][j] = 'x';
        }
      }
    }

    while (row < n) {
      // set columns (j) to all 'a'
      row++;
      if (row < n) {
        if (newMatrix[i][row] !== 1) {
          newMatrix[i][row] = 'x';
        }
      }
    }

    if (i > 0) {
      col = i;
      while (col !== 0) {
        col--;
        if (newMatrix[col][j] !== 1) {
          newMatrix[col][j] = 'x';
        }
      }
    }
    if (j > 0) {
      row = j;
      while (row !== 0) {
        row--;
        if (newMatrix[i][row] !== 1) {
          newMatrix[i][row] = 'x';
        }
      }
    }
  };

  // checks position with 0 and sets it with Rook
  var emptyPositionChecker = function (matrix) {
    for (var i = 0; i < matrix.length; i++) {
      for (var j = 0; j < matrix.length; j++) {
        if (matrix[i][j] === 0) {
          matrix[i][j] = 1;
          collision(i, j);
          return true;
        }
      }
    }

    return false;
  };


  // loop for every position on the board
  loop1:
    for (var i = 0; i < newMatrix.length; i++) {
      var row = newMatrix[i];

      for (var j = 0; j < newMatrix.length; j++) {
        // pick a position for rook
        newMatrix[i][j] = 1;

        // grey out collison zones due to the above position
        collision(i, j);

        var hasEmpty = true;

        while (hasEmpty) {
          //call empty position checker
          if (emptyPositionChecker(newMatrix)) {
            continue;
          } else {
            //else we found a complete matrix, break
            hasEmpty = false;
            solutionCount++;
            // reinitiaze new array to start all over
            newMatrix = createMatrix(n);
            break;
          }
        }

      }
    }
var createMatrix=函数(n){
var newMatrix=新数组(n);
//构建矩阵
对于(变量i=0;i0){
col=i;
while(列!==0){
col--;
if(newMatrix[col][j]!==1){
新矩阵[col][j]='x';
}
}
}
如果(j>0){
row=j;
while(行!==0){
行--;
if(newMatrix[i][row]!==1){
newMatrix[i][row]='x';
}
}
}
};
//用0检查位置并用Rook设置
var emptyPositionChecker=函数(矩阵){
对于(变量i=0;i
似乎有两个潜在的问题

第一个是发现了同一位置的多个副本

如果我们考虑n=3的情况,通过将第一个木块放在红色,第二个放置绿色,第三个放置蓝色,我们得到这三个板:

它们是相同的位置,但在给定的Javascript中会计为3个独立的位置

对于3x3板,还有2个其他位置有重复。将唯一位置的计数设置为9-2-1-1=5。但我们期待着N!=6个职位

这就引出了第二个问题,即一些职位空缺。在N=3的情况下,当i==j==1-即电路板的中点时,这种情况发生一次

达到此位置:

未达到此位置:

现在我们有了位置的数量,应该是9-2-1-1+1

在实现给定算法的过程中,实际的Javascript似乎没有什么问题。错误的是该算法同时查找和计数重复项,并且缺少一些位置

解决N Rooks问题的一种常见方法是使用递归方法,而不是迭代方法,如果迭代试图评估任何大小的电路板上的每个位置,它可能很快就会完全失控


这个问题最好在讨论算法的其他stackexchange站点上解决。

如果在添加到solutionCount时对newMatrix执行console.log操作,您将看到某些模式重复,并且(可能)有些模式找不到。我可以理解有些模式重复,但我似乎无法理解为什么我会错过一些组合,因为我正在板上的每个位置循环。当我以n=3运行代码时,我似乎错过了xx1xxx。也许我把你的代码抄错了?也许你能帮我们查一查吗?谢谢!我不经常使用JSFIDLE,但它就在这里。让我知道你是否可以访问它?谢谢-是的,我看到了小提琴,但一点也不能仔细看。谢谢你的详细解释。几天前,我发现了问题所在,并且确实遇到了递归的需要。我的递归能力不是很好,但如果你有任何资源可以告诉我的话,我会很好地处理递归?我已经快速浏览了一遍,坦率地说,有一些文章相当混乱,但一个简单的是[link],在[link]还有一个JS rooks解决方案它本身并不太长,但我认为它正在使用Lodash库中的记忆函数来存储临时结果,所以事情变得有点复杂。