1. 程式人生 > 實用技巧 >52. N皇后 II

52. N皇后 II

題目:n皇后問題研究的是如何將n個皇后放置在n×n的棋盤上,並且使皇后彼此之間不能相互攻擊。

上圖為 8 皇后問題的一種解法。

給定一個整數n,返回n皇后不同的解決方案的數量。

示例:

輸入: 4
輸出: 2
解釋: 4 皇后問題存在如下兩個不同的解法。
[
[".Q..", // 解法 1
 "...Q",
 "Q...",
 "..Q."],

["..Q.", // 解法 2
 "Q...",
 "...Q",
 ".Q.."]
]

程式碼1://直接使用51題程式碼。

classSolution{ staticintcount=0; publicinttotalNQueens(intn){ count=0; vararraylist=newArrayList<String>(n); char[]ch=newchar[n]; Arrays.fill(ch,'.'); StringBuilderstr=newStringBuilder(); str.append(ch); backTrack(arraylist,1,n,str); returncount; }
//回溯法,遞迴迴圈查詢解集 publicstaticvoidbackTrack(List<String>arraylist,intt,intn,StringBuilderstr){ if(t>n){ count++; return; }
for(inti=0;i<n;i++){ str.setCharAt(i,'Q'); arraylist.add(str.toString()); if(isOk(arraylist)){ str.setCharAt(i,'.'); backTrack(arraylist,t+1,n,str);}//String是引用傳遞 arraylist.remove(arraylist.size()-1); str.setCharAt(i,'.'); } } publicstaticbooleanisOk(List<String>arraylist){ if(arraylist.size()==1){returntrue;} int[]index=newint[arraylist.size()]; index[arraylist.size()-1]=arraylist.get(arraylist.size()-1).indexOf('Q'); //arr陣列存放每行皇后的位置i為行,arr[i]為列數 for(inti=0;i<arraylist.size()-1;i++){ index[i]=arraylist.get(i).indexOf('Q'); if(index[arraylist.size()-1]==index[i]){returnfalse;} }
//排查斜線上,列數不能為上i行列數不能為這一行的+i|-i列 for(inti=arraylist.size()-2,j=1;i>=0;--i,++j){ if(index[arraylist.size()-1]==index[i]-j||index[arraylist.size()-1]==index[i]+j){returnfalse;} } returntrue; } }