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; } } } }