Leetcode-N-Queens
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
Have you met this question in a real interview?
Analysis:
How to determine whether the current position at jth row is valid? Suppose jth row position is place[j] and ith row position is place[i]. Then we found that place[i] leads three positions at jth row invalid. They are place[i], place[i]+j-i, place[i]-(j-i).
Solution:
1 public class Solution { 2 public List<String[]> solveNQueens(int n) { 3 List<String[]> res = new ArrayList<String[]>(); 4 int[] place = new int[n]; 5 Arrays.fill(place,-1); 6 int level = 0; 7 8 while (level!=-1){ 9 if (level>=n){ 10 constructRes(place,res,n); 11 level--; 12 continue; 13 } 14 15 int val = place[level]; 16 val++; 17 while (val<n){ 18 boolean valid = true; 19 for (int i=0;i<level;i++) 20 if (val==place[i] || val==place[i]+level-i || val==place[i]-(level-i)){ 21 valid = false; 22 break; 23 } 24 if (valid) break; 25 else val++; 26 } 27 28 if (val<n){ 29 place[level]=val; 30 level++; 31 } else { 32 place[level]=-1; 33 level--; 34 } 35 } 36 37 return res; 38 39 } 40 41 public void constructRes(int[] place, List<String[]> res, int n){ 42 char[] line = new char[n]; 43 Arrays.fill(line,'.'); 44 String[] oneRes = new String[n]; 45 for (int i=0;i<n;i++){ 46 int val = place[i]; 47 line[val]='Q'; 48 String lineStr = new String(line); 49 line[val]='.'; 50 oneRes[i]=lineStr; 51 } 52 res.add(oneRes); 53 } 54 }