題目:
回想起來8皇后問題是當時算法課考試的最後一題,看分數的話這題當時應該是寫錯了不得分。
答案:
慚愧,還是沒能寫出來對的答案,只是大致知道用回溯法,編程能力還是不夠。
答案轉自:https://blog.csdn.net/xygy8860/article/details/46861381
public class Solution {
/**
* 這題的整體思想是建一個x[n]的數組,意爲第i放第x[i]列放置皇后
* 皇后的合法判斷規則是列不相等,斜線上也不相等
* i + x[i] == j + x[j] 表示正斜線一致
* x[i] - i = x[j] - j 表示負斜線上一致 都不合法
*/
List<List<String>> list;//保存結果
public List<List<String>> solveNQueens(int n) {
list = new ArrayList<List<String>>();
int[] x = new int[n];//保存結果
queens(x, n, 0);
return list;
}
void queens(int[] x,int n,int row){
for(int i = 0; i < n; i++){
if(check(x,n,row,i)){//判斷合法
x[row] = i;//將皇后放在第row行,第i列
if(row == n-1){//如果是最後一行,則輸出結果
addList(x,n);
x[row] = 0;//回溯,尋找下一個結果
return;
}
queens(x, n, row+1);//尋找下一行
x[row] = 0;//回溯
}
}
}
/**
* 將每一組的結果添加list
* @param x 數組解
* @param n 棋盤長寬
*/
private void addList(int[] x,int n) {
//添加結果
String[][] sArr = new String[n][n];
List<String> al = new ArrayList<String>();
for(int i = 0; i < n ; i++){
Arrays.fill(sArr[i], ".");//先填充.
sArr[i][x[i]] = "Q";//特定位置放置Q
String s = "";
for(String str:sArr[i]){
s += str;//加在一起
}
al.add(s);//添加一行
}
list.add(al);//添加一組解
}
/**
* @param x 數組解
* @param n 棋盤長寬
* @param index 當前放置行
* @param i 當前放置列
* @return
*/
boolean check(int[] x,int n,int row, int col){
for(int i = 0; i < row; i++){
//因爲行不相等,判斷列是否相等,斜線上是否相等
if(x[i] == col || x[i] + i == col + row || x[i] - i == col - row)
return false;
}
return true;
}
}