[leetcode]N-Queens II

一开始不明白为什么有这么一道几乎完全一样的,但把I的改一下超时了,所以要优化一下。经搜索,发现可以这样优化:使用col[i]表示第i行Q所在的列,那么,判断斜线是否满足就可以用abs(k-i)== abs(col[k]-j),注意这里k要小于i,因为后面的行没有放Q,而默认初始化时0列放Q,就会错误。

public class Solution {
    private int ans;
    private boolean[] visited;
    private int[] col;
    public int totalNQueens(int n) {
        ans = 0;
        col = new int[n];
        visited = new boolean[n];
        sub(0);
        return ans;
    }
    
    private void sub(int i)
    {
        int n = col.length;
        if (i == n)
        {
            ans++;
        }
        else
        {
            for (int j = 0; j < n; j++)
            { 
                if (!visited[j] && isValid(i, j))
                {
                    col[i] = j;
                    visited[j] = true;
                    sub(i+1);
                    visited[j] = false;
                } 
            }
        }
    }
    
    private boolean isValid(int i, int j)
    {
        // only need to validate column and 'X' direction
        for (int k = 0; k < i; k++)
        {
            if (Math.abs(k-i)== Math.abs(col[k]-j)) return false;
        }
        return true;
    }
}

  

原文地址:https://www.cnblogs.com/lautsie/p/3349573.html