package com.interview.books.leetcodeoj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-12-22
* Time: 下午4:19
*/
public class LOJ51_NQueens {
//do backtracing on every position, like permutation
//check if current position can place: two queens can't put in diagonal line:(Math.abs(queens[i] - position) == offset - i)
//fill queens with -1 for initialize
List<String[]> sols;
public List<String[]> solveNQueens(int n) {
sols = new ArrayList<>();
int[] queens = new int[n];
Arrays.fill(queens, -1);
solveNQueens(n, 0, queens);
return sols;
}
public void solveNQueens(int n, int offset, int[] queens){
if(offset == n){//found a solution
sols.add(getSolution(queens));
return;
}
for(int i = 0; i < n; i++){
if(canPlace(i, offset, queens)){
queens[offset] = i;
solveNQueens(n, offset + 1, queens);
}
}
}
public boolean canPlace(int position, int offset, int[] queens){
for(int i = 0; i < offset; i++){
if(position == queens[i] || (Math.abs(queens[i] - position) == offset - i)) return false;
}
return true;
}
public String[] getSolution(int[] queens){
String[] sol = new String[queens.length];
char[] chars = new char[queens.length];
Arrays.fill(chars, '.');
for(int i = 0; i < queens.length; i++){
chars[queens[i]] = 'Q';
sol[i] = String.valueOf(chars);
chars[queens[i]] = '.';
}
return sol;
}
}