n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
public class Solution {
public IList<IList<string>> SolveNQueens(int n) {
List<IList<string>> queens = new List<IList<string>>();
dfs(queens, new int[n], 0);
return queens;
}
private static void dfs(List<IList<string>> all, int[] result, int row){
if (row == result.Length){
List<string> tmpLst = new List<string>();
for (int j = 0; j < result.Length; j++){
StringBuilder sb = new StringBuilder();
for (int k = 0; k < result.Length; k++)
if (result[j] == k) sb.Append("Q");
else sb.Append(".");
tmpLst.Add(sb.ToString());
}
all.Add(tmpLst);
return;
}
for (int i = 0; i < result.Length; i++){
bool bAvail = true;
for (int j = 0; j < row; j++)
if (result[j] == i || Math.Abs(result[j] - i) == row - j) bAvail = false;
if (bAvail){
int[] result2 = new int[result.Length];
Array.Copy(result, result2, result.Length);
result2[row] = i;
dfs(all, result2, row + 1);
}
}
return;
}
}