Java 为什么count的值不为';不变

Java 为什么count的值不为';不变,java,integer,Java,Integer,我知道这是一个非常简单的问题,而且我对编程还不熟悉,这让我有好几个小时的时间。。 下面是我的代码,我真的不知道为什么计数不正确;t随函数的变化而变化 public class Solution { public int totalNQueens(int n) { int count =4; boolean[] col = new boolean[n]; boolean[] dia1 = new boolean[2*n]; b

我知道这是一个非常简单的问题,而且我对编程还不熟悉,这让我有好几个小时的时间。。 下面是我的代码,我真的不知道为什么计数不正确;t随函数的变化而变化

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;
            }
        }
    }
}
公共类解决方案{
公共整数总计(整数n){
整数计数=4;
布尔值[]列=新的布尔值[n];
布尔值[]dia1=新的布尔值[2*n];
布尔值[]dia2=新的布尔值[2*n];
回溯(0,col,dia1,dia2,count,n);
返回计数;
}
私有无效回溯(int rownum,boolean[]col,boolean[]dia1,boolean[]dia2,int count,int n){
计数=5;
如果(rownum==n){
计数++;
}否则{

对于(int i=0;i,因为在totalNQueens函数中,您将count设置为4…然后返回它。调用backtrack函数后,它是一个“不同”的计数,不会改变totalNQueens中的count变量。有几种方法可以解决它,最简单的方法是使backtrack方法成为一个返回“count”的函数或者你可以把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;
    }
}
公共类解决方案{
公共整数总计(整数n){
整数计数=4;
布尔值[]列=新的布尔值[n];
布尔值[]dia1=新的布尔值[2*n];
布尔值[]dia2=新的布尔值[2*n];
返回回溯(0,col,dia1,dia2,count,n);
}
私有int回溯(int rownum,boolean[]col,boolean[]dia1,boolean[]dia2,int count,int n){
如果(rownum==n){
计数++;
}否则{

对于(int i=0;i,因为在totalNQueens函数中,您将count设置为4…然后返回它。调用backtrack函数后,它是一个“不同”的计数,不会改变totalNQueens中的count变量。有几种方法可以解决它,最简单的方法是使backtrack方法成为一个返回“count”的函数或者你可以把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;
    }
}
公共类解决方案{
公共整数总计(整数n){
整数计数=4;
布尔值[]列=新的布尔值[n];
布尔值[]dia1=新的布尔值[2*n];
布尔值[]dia2=新的布尔值[2*n];
返回回溯(0,col,dia1,dia2,count,n);
}
私有int回溯(int rownum,boolean[]col,boolean[]dia1,boolean[]dia2,int count,int n){
如果(rownum==n){
计数++;
}否则{

对于(int i=0;我非常感谢您的解释,但我仍然不明白为什么TotalNquiens中的计数与我在一开始声明的计数是不同的变量……我想我不太明白您说的计数没有变化的确切位置。如果您只看TotalNquiens的返回值,它看起来会一直保持不变ys应该是4,因为变量范围。或者,你是说在“回溯”中它不会变为5或6(第一次迭代)?因为你怎么知道,除非你正在运行一个调试器或打印某个地方的值,否则你不会给我们所有的代码。不过,我是说,不管你传递给TotalQueens什么,它总是返回4。你在声明一个新的不同变量,称为“count”在你的回溯函数中。非常感谢你的解释,但我仍然不明白为什么TotalNquiens中的计数与我在一开始声明的计数是不同的变量……我想我不太明白你说计数没有变化的确切位置。如果你只看TotalNquiens的返回值,它看起来因为变量的作用域,它总是4。或者,你是说在“回溯”中它不会变为5或6(第一次迭代)?因为你怎么知道,除非你正在运行一个调试器或在某处打印值,否则你不会给我们所有的代码。不过,我是说,不管你传递给TotalQueens什么,它总是返回4。你在回溯函数中声明了一个名为“count”的新的不同变量。