N-Queens II

来源:互联网 发布:java变量命名规则$ 编辑:程序博客网 时间:2024/06/03 22:53

原题:

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.

即n皇后问题不用返回解集,返回解集数量就可以。


思考过程&解题思路:

和N-QueensI思路一样,只不过省略处理结果集一步,直接计数就可以了。详情见代码注释。


结果代码:

int ret = 0;    public int totalNQueens(int n) {        int[] subRet = new int[n];        backTrackingForTotal(subRet,0,1,n);        return ret;    }    public void backTrackingForTotal(int[] subRet,int row,int column,int n){        if (column == n + 1)//column越界的情况            if (subRet[row] == 0) return;//说明这一行没有皇后,这个解集是失败的,不再用。return            else if (row == n - 1){//解集已经补全了                ret++;                return;            }            else {                row++;column = 1;//以上情况都不属于,那么变到下一行。            }        int[] newSubRet = new int[n];        newSubRet = Arrays.copyOf(subRet,n);//复制一个解集,用于在当前位置放'Q'        if (canPutQ(newSubRet,row,column))//判断是否可以放'Q'            backTrackingForTotal(newSubRet,row,n + 1,n);//如果能,调到下一行        backTrackingForTotal(subRet,row,column + 1,n);//不能放的情况,向后走    }public boolean canPutQ(int[] subRet,int row,int column){//判断此处是否可以放'Q'        if (subRet[row] != 0) return false;//这行有'Q',返回false        for (int i = 0;i < row;i++)            if (subRet[i] == column || Math.abs(subRet[i] - column) == Math.abs(i - row)) return false;//这一列或者斜线上是否有Q        subRet[row] = column;        return true;    }

原创粉丝点击