N皇后问题
Posted 萝卜er
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N皇后问题相关的知识,希望对你有一定的参考价值。
n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。
给定一个整数n,返回所有不同的n皇后问题的解决方案。
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
样例
对于4皇后问题存在两种解决的方案:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
思路:由题意可知,每一行只能有一个,每一列也只能有一个,同一斜线上也只能有一个, 那么可以用一个数组来表示位置ARR[2]=1表示第三行的皇后在第二列(索引从0开始),这样每一行只会有一个了。main函数的主要作用是检查第i行可以放哪些位置,然后然后把对应的..Q序列放进temp中,然后递归调用main,最后要再把上一步放入的序列拿出来。。。本来一看好麻烦,可是动手开始敲了,当做一个个小问题来处理,没想到竟然一遍bug free了,还是要多尝试
java版代码
class Solution { /** * Get all distinct N-Queen solutions * @param n: The number of queens * @return: All distinct solutions * For example, A string ‘...Q‘ shows a queen on forth position */ ArrayList<ArrayList<String>> solveNQueens(int n) { // write your code here int[] arr=new int[n]; ArrayList<ArrayList<String>> ans=new ArrayList<ArrayList<String>>(); ArrayList<String> temp=new ArrayList<String>(); main(temp,ans,n,0,arr); return ans; } void main(ArrayList<String> temp,ArrayList<ArrayList<String>> ans,int n,int i,int[] arr){ if(temp.size()==n){ ans.add(new ArrayList(temp)); return; } for(int k=0;k<n;k++){ if(isthat(arr,i,k)){ arr[i]=k; String s=pr(k,n); temp.add(s); main(temp,ans,n,i+1,arr); temp.remove(temp.size()-1); } } return; } boolean isthat(int[] arr,int k,int n){ for(int i=0;i<k;i++){ if(arr[i]==n||Math.abs(i-k)==Math.abs(n-arr[i])){ return false; } } return true; } String pr(int n,int an){ String s=""; for(int i=0;i<n;i++){ s+="."; } s+="Q"; for(int i=n+1;i<an;i++){ s+="."; } return s; } };
以上是关于N皇后问题的主要内容,如果未能解决你的问题,请参考以下文章