【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;
    }
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84024090