51. N-Queens

class Solution {
    public List<List<String>> solveNQueens(int n) {
        int[][] board=new int[n][n];
        List<List<String>> res=new ArrayList<List<String>>();
        nQueens(0,board,res);
        return res;
    }
    private void nQueens(int i, int[][] board, List<List<String>> res){
        if(i==board.length)
        {
            List<String> list=new ArrayList<String>();
            for(int y=0;y<board.length;y++)
            {
                String row="";
                for(int x=0;x<board.length;x++)
                    row+=board[y][x]==1?'Q':'.';
                list.add(row);
            }
            res.add(list);
            return;
        }
        for(int j=0;j<board.length;j++)
            if(board[i][j]==0)
            {
                board[i][j]=1;
                fillQueuePath(i, j, board, -1);
                nQueens(i+1,board,res);
                fillQueuePath(i, j, board, 1);
                board[i][j]=0;
            }
    }
    private void fillQueuePath(int i, int j, int[][] board, int val){
        for(int k=1;i+k<board.length;k++)
        {
            board[i+k][j]+=val;
            if(j-k>=0)
                board[i+k][j-k]+=val;
            if(j+k<board.length)
                board[i+k][j+k]+=val;
        }
    }
}
class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> res=new ArrayList<List<String>>();
        boolean[] cols=new boolean[n];
        boolean[] d1=new boolean[n*2];
        boolean[] d2=new boolean[n*2];
        solveNQueens(0, cols, d1, d2, new ArrayList<String>(), res);
        return res;
    }
    private void solveNQueens(int i, boolean[] cols, boolean[] d1, boolean[] d2, List<String> list, List<List<String>> res)
    {
        if(i==cols.length)
        {
            res.add(new ArrayList<String>(list));
            return;
        }
        for(int j=0;j<cols.length;j++)
        {
            int dn1=i-j+cols.length;
            int dn2=i+j;
            if(cols[j]==false&&d1[dn1]==false&&d2[dn2]==false)
            {
                cols[j]=true;
                d1[dn1]=true;
                d2[dn2]=true;
                String row="";
                for(int k=0;k<cols.length;k++)
                    row+=k==j?'Q':'.';
                list.add(row);
                solveNQueens(i+1,cols, d1, d2, list, res);
                list.remove(list.size()-1);
                cols[j]=false;
                d1[dn1]=false;
                d2[dn2]=false;
            }
        }
    }
}

 

posted @ 2017-09-25 12:45  Weiyu Wang  阅读(169)  评论(0编辑  收藏  举报