Javascript 试图解决N Rook问题时遇到问题。总是得到n*n解,而不是n阶乘
我试图找到解决N车问题的N种方法。我现在遇到的问题是,我似乎得到了n*n个解决方案,而它需要n。下面是我的代码,我用简单的循环和函数编写了它,所以它相当长。任何帮助都将不胜感激 注:请忽略n=2的情况。我得到了一些我认为可以通过JSON.stringify处理的副本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 <
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库中的记忆函数来存储临时结果,所以事情变得有点复杂。