class Solution { public int totalNQueens(int n) { int[][] board=new int[n][n]; return totalNQueens(0, board); } private int totalNQueens(int i, int[][] board) { if(i==board.length) return 1; int ret=0; for(int j=0;j<board.length;j++) if(board[i][j]==0) { board[i][j]=1; fillQueuePath(i, j, board, -1); ret+=totalNQueens(i+1,board); fillQueuePath(i, j, board, 1); board[i][j]=0; } return ret; } 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 int totalNQueens(int n) { boolean[] cols=new boolean[n]; boolean[] d1=new boolean[n*2]; boolean[] d2=new boolean[n*2]; return totalNQueens(0, cols, d1, d2); } private int totalNQueens(int i, boolean[] cols, boolean[] d1, boolean[] d2) { if(i==cols.length) return 1; int ret=0; 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; ret+=totalNQueens(i+1,cols, d1, d2); cols[j]=false; d1[dn1]=false; d2[dn2]=false; } } return ret; } }