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.."] ]
这道题就是求解n皇后问题。皇后不能出在同一条直线、竖线以及斜线上。
想法就是 1、建立一个n的数组pos[n],表示第i行的皇后放在第pos[i]处。
2、然后需要在第num个放皇后的时候,需要依次判断前num个数字(i : 0 --> num-1),这个位置的数字不能与pos[i],pos[i]-(num-i),pos[i]+(num-i)这三个数字相同,判断完之前的所有数字之后,就可以放入该数字了。
结果是3ms。算是还可以的成绩。
public class Solution { public List<List<String>> solveNQueens(int n) { List<List<String>> result = new ArrayList<List<String>>(); int[] pos = new int[n]; putQueen(pos,0,result); return result; } public void putQueen(int[] pos,int num,List<List<String>> result){ if( num == pos.length ){ List<String> res = new ArrayList<String>(); char[] ans = new char[pos.length]; for( int j =0;j<pos.length ;j++) ans[j] = '.'; for( int i = 0;i<pos.length; i++ ){ ans[pos[i]] = 'Q'; res.add(new String(ans)); ans[pos[i]] = '.'; } result.add(res); } int[] exi = new int[pos.length]; for( int i = 0;i<num;i++){ exi[pos[i]] = 1; if( pos[i]-(num-i) >= 0) exi[pos[i]-(num-i)] = 1; if( pos[i]+num-i < pos.length) exi[pos[i]+num-i] = 1; } for( int i = 0; i<pos.length;i++){ if( exi[i] == 0){ pos[num] = i; putQueen(pos,num+1,result); } } } }
52题
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
这题和上面的一样,就是求出解的个数。
代码就是简单修改一下即可。
public class Solution { public int totalNQueens(int n) { int[] pos = new int[n]; return putQueen(pos,0,0); } public int putQueen(int[] pos,int num,int total){ if( num == pos.length ){ return total+1; } int[] exi = new int[pos.length]; for( int i = 0;i<num;i++){ exi[pos[i]] = 1; if( pos[i]-(num-i) >= 0) exi[pos[i]-(num-i)] = 1; if( pos[i]+num-i < pos.length) exi[pos[i]+num-i] = 1; } for( int i = 0; i<pos.length;i++){ if( exi[i] == 0){ pos[num] = i; total = putQueen(pos,num+1,total); } } return total; } }