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