51. N 皇后
阿新 • • 發佈:2020-12-20
題目:n皇后問題研究的是如何將n個皇后放置在n×n的棋盤上,並且使皇后彼此之間不能相互攻擊。
上圖為 8 皇后問題的一種解法。
給定一個整數n,返回所有不同的n皇后問題的解決方案。
每一種解法包含一個明確的n皇后問題的棋子放置方案,該方案中'Q'
和'.'
分別代表了皇后和空位。
程式碼://求解集很明顯是用回溯法,但效率太低了 第二種方法利用二維陣列來做
classSolution{ publicList<List<String>>solveNQueens(intn){ vararraylist=newArrayList<String>(n); varlist=newArrayList<List<String>>(); char[]ch=newchar[n]; Arrays.fill(ch,'.'); StringBuilderstr=newStringBuilder(); str.append(ch); backTrack(list,arraylist,1,n,str); returnlist; }//回溯法,遞迴迴圈查詢解集 publicstaticvoidbackTrack(List<List<String>>list,List<String>arraylist,intt,intn,StringBuilderstr){ if(t>n){ list.add(newArrayList<String>(arraylist)); return; }
for(inti=0;i<n;i++){ str.setCharAt(i,'Q'); arraylist.add(str.toString()); if(isOk(arraylist)){ str.setCharAt(i,'.'); backTrack(list,arraylist,t+1,n,str);} //String是引用傳遞 arraylist.remove(arraylist.size()-1); str.setCharAt(i,'.'); } } publicstaticbooleanisOk(List<String>arraylist){ if(arraylist.size()==0){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; } }