1. 程式人生 > >【leetcode】51. (Hard) N-Queens

【leetcode】51. (Hard) N-Queens

題目連結


解題思路:
回溯

res用於存放所有的結果
positions用於記錄當前已經擺放好的有效的皇后的位置
columns是一個一維陣列,長度為n。用於記錄第一排、第二排、第三排…的皇后的位置(所在的列)。

主體函式是solveNQueens.
newDistrubution是回溯函式,用於檢測當前行(row)中各個列的位置是否有效。邊界是row當前行數,如果當前行數已經計算到n(行數從0…n-1),則將positions所有皇后所在位置的二維陣列轉化成List<List< String >>的格式,並將結果存到最終結果res(result)裡。
IsValid函式用檢測將queen放在當前row的當前column裡面是否有效。


提交程式碼:

class Solution {
    public List<List<String>> solveNQueens(int n) {
    	List<List<String>> res=new ArrayList<List<String>>();
    	int[][] positions=new int[n][n];
    	int[] columns=new int[n];
    	
    	for(int i=0;i<n;i++)
    		columns[i]=-
1; newDistribution(0,n,res,positions,columns); return res; } public void newDistribution(int row,int n, List<List<String>> res,int[][] positions,int[] columns) { /* row: current row * n: the size of the chess * res: result * positions: present valid queens' positions we have * columns: columns where current queens have occupied */
if(row==n) { res.add(turnArraysToList(positions,columns)); return; } for(int i=0;i<n;i++) { positions[row][i]=1; if(isValid(row,positions,columns,i)) { columns[row]=i; newDistribution(row+1,n,res,positions,columns); } columns[row]=-1;positions[row][i]=0; } } public boolean isValid(int row,int[][] positions,int[] columns,int column) { /* check if the new column in row is valid * row: current row * positions: the positions of current queens we have * columns: the columns of current queens occupy * */ //check the volumn for(int i=0;i<row;i++) if(columns[i]==column) return false; //check the diagonal for(int i=0;i<row;i++) { if(row-i==(column-columns[i])) return false; else if(row-i==columns[i]-column) return false; } return true; } public List<String> turnArraysToList(int[][] positions,int[] columns){ /*turn the 2-dimension arrays to List<String>*/ List<String> result=new ArrayList<String>(); for(int i=0;i<positions.length;i++) { String str=""; for(int j=0;j<columns[i];j++) str+="."; str+="Q"; for(int j=0;j<positions.length-columns[i]-1;j++) str+="."; result.add(str); } return result; } }

執行結果:
在這裡插入圖片描述