为什么计数值不会改变

时间:2017-06-27 03:58:41

标签: java integer

我知道这是一个非常简单的问题,我是编程的新手,它让我兄弟几个小时...... 以下是我的代码,我真的不知道为什么计数没有随着函数的变化而变化

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;
            }
        }
    }
}

1 个答案:

答案 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。所以我删除了它,因为我不认为它实际上是你的算法的一部分。设置在我的回溯功能中设置它的计数也可能是错误的...我不知道你的算法(虽然我可以猜出你正在解决的问题)。

同样,我恳请你查阅“变量范围。”