我知道这是一个非常简单的问题,我是编程的新手,它让我兄弟几个小时...... 以下是我的代码,我真的不知道为什么计数没有随着函数的变化而变化
public class Solution {
public int totalNQueens(int n) {
int count =4;
boolean[] col = new boolean[n];
boolean[] dia1 = new boolean[2*n];
boolean[] dia2 = new boolean[2*n];
backtrack(0, col, dia1, dia2,count,n);
return count;
}
private void backtrack(int rownum, boolean[] col, boolean[] dia1, boolean[] dia2, int count,int n){
count =5;
if(rownum==n){
count++;
}else{
for(int i=0; i<n;i++){
int index1 = i-rownum+n;
int index2 = i+rownum;
if(col[i]||dia1[index1]||dia2[index2]) continue;
col[i]=true; dia1[index1]=true; dia2[index2]=true;
backtrack(rownum+1, col,dia1,dia2,count,n);
col[i]=false; dia1[index1]=false; dia2[index2]=false;
}
}
}
}
答案 0 :(得分:0)
因为在你的totalNQueens函数中,你将count设置为4 ......然后你将它返回。一旦调用了回溯函数,它就是一个“不同”的计数,它不会改变totalNQueens中的计数变量。有几种方法可以解决它,最简单的方法是使你的回溯方法成为最后返回“count”的函数。或者你可以计算一个类变量。
编辑:我应该推荐你查找“变量范围。”
编辑2:试试这个,而不是:
public class Solution {
public int totalNQueens(int n) {
int count =4;
boolean[] col = new boolean[n];
boolean[] dia1 = new boolean[2*n];
boolean[] dia2 = new boolean[2*n];
return backtrack(0, col, dia1, dia2,count,n);
}
private int backtrack(int rownum, boolean[] col, boolean[] dia1, boolean[] dia2, int count,int n){
if(rownum==n){
count++;
}else{
for(int i=0; i<n;i++){
int index1 = i-rownum+n;
int index2 = i+rownum;
if(col[i]||dia1[index1]||dia2[index2]) continue;
col[i]=true; dia1[index1]=true; dia2[index2]=true;
count = backtrack(rownum+1, col,dia1,dia2,count,n);
col[i]=false; dia1[index1]=false; dia2[index2]=false;
}
}
return count;
}
}
但是,这里存在一些问题。您正在使用递归。我认为你的代码不会做你想要的,因为你将count = 5设置为“回溯”的第一行。我猜这是为了调试目的,只是为了看它改变你的返回值,但当然它只影响回溯中“count”的“实例”,而不是totalNQueens。所以我删除了它,因为我不认为它实际上是你的算法的一部分。设置在我的回溯功能中设置它的计数也可能是错误的...我不知道你的算法(虽然我可以猜出你正在解决的问题)。
同样,我恳请你查阅“变量范围。”