52. N-Queens II

= =这个题好像跟另一个N-QUEEN一样的。。
我还以为distinct要转棋盘呢。。比如某种解旋转期盼180°和另一种一样,就要去掉。。结果发现根本不是,就是算总数,比上一个少了个构建LIST的步骤。

public class Solution 
{
    int res = 0;
    public int totalNQueens(int n) 
    {
        int[] dp = new int[n];
        
        helper(dp,n,0);
    
        return res;    
    }
    
    public void helper(int[] dp, int n, int row)
    {
        if(n == row) res++;
        else
        {
            for(int i = 0; i < n;i++)
            {
                dp[row] = i;
                if(isFine(dp,row)) helper(dp,n,row+1);
            }
        }
    }
    
    
    public boolean isFine(int[] dp, int atWhere)
    {
        for(int i = 0; i < atWhere;i++)
        {
            if(dp[i] == dp[atWhere] || Math.abs(i-atWhere) == Math.abs(dp[i] - dp[atWhere])) return false;
            
        }
        return true;
    }
    
    
}


二刷。还是三刷的。

一样。。一维DP作为CHECK,然后DFS+BACKTRACK

Time: O(n^n)
Space: O(n)

public class Solution {
    int res = 0;
    public int totalNQueens(int n) {
        if (n == 0) return 0;
        int[] row = new int[n];
        dfs(row, 0);
        return res;
    }
    
    public void dfs(int[] row, int m) {
        if (m == row.length) {
            res++;
        } else {
            for (int i = 0; i < row.length; i++) {
                row[m] = i;
                if (isValid(row, m)) {
                    dfs(row, m + 1);
                }
            }
        }
    }
    
    public boolean isValid(int[] row, int m) {
        for (int i = 0; i < m; i++) {
            if (row[m] == row[i]) return false;
            if (Math.abs(m - i) == Math.abs(row[m] - row[i])) return false;
        }
        return true;
    }
}
posted @ 2016-11-08 12:35  哇呀呀..生气啦~  阅读(96)  评论(0)    收藏  举报