N-Queens II (Java)

Follow up for N-Queens problem.

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


八皇后问题:所有皇后所在行、列、斜线上不能有其他皇后出现。

用回溯法做,枚举第一行皇后可以在的所有位置,根据所在位置推出第二个皇后所在位置,以此类推,当推到最后一个后,就count+1。在推导过程中,如果遇到非法位置,则回溯到上一层。所以只有到达最后一行的放置方法才可以使count + 1。

用一维数组下标表示行,值表示列。

斜线判断方法:行坐标相减,列坐标相减,如果相等或负相等(最好用两个的绝对值, 比如出现[1,2]和[2,1])则在同一斜线上。

Source

public class Solution {
	int count = 0;
    public int totalNQueens(int n) {
        if(n == 0) return 0;
    	int[] col = new int[n];
        
        backtrack(n, 0, col);
        return count;
    }
    public void backtrack(int n, int row, int[] col){
    	if(row == n){
    		count += 1;
    		return;
    	}
    	for(int i = 0; i < n; i++){
    		col[row] = i;  //第row行放在i的位置上   枚举i的位置
    		
    		if(isValid(row, col))
    			backtrack(n, row + 1, col);
    	}
    }
    public boolean isValid(int row, int[] col){
    	for(int i = 0; i < row; i++){ //检查已经放置的是否有效 注意end是row - 1
    		if(col[row] == col[i] || Math.abs(col[row] - col[i]) == row - i)  //同一斜线上的点有的性质:绝对值列值相减==行值相减
    			return false;
    	}
    	return true;
    }
}


Test

    public static void main(String[] args){
    
    	int n = 4;
    	System.out.println(new Solution().totalNQueens(n));
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值