package com.interview.books.leetcodeoj;
/**
* Created_By: stefanie
* Date: 14-12-22
* Time: 下午4:52
*/
public class LOJ52_NQueensII {
//backtracing using loop
//scan from offset 0, and queens[offset] = -1;
//while(offset >= 0 && offset < n) do searching by queens[offset]++;
//try next position when can't fit: while(queens[offset] < n && !canPlace(offset, queens)) queens[offset]++;
//if(queens[offset] == n) can't find a solution, offset--; backtrace
//else if already in last queens, mark the solution, if not find the next queens by offset++, queens[offset] = -1;
public int totalNQueens(int n) {
int count = 0;
int[] queens = new int[n];
int offset = 0;
queens[offset] = -1;
while(offset >= 0 && offset < n){
queens[offset]++;
while(queens[offset] < n && !canPlace(offset, queens)) queens[offset]++;
if(queens[offset] == n){//doesn't find a solution
offset--;
} else {
if(offset == n - 1){//found a solution
count++;
} else {
offset++;
queens[offset] = -1;
}
}
}
return count;
}
public boolean canPlace(int offset, int[] queens){
for(int i = 0; i < offset; i++){
if(queens[i] == queens[offset] || (Math.abs(queens[i] - queens[offset]) == offset - i)) return false;
}
return true;
}
}