c# leetcode 51. N皇后(回溯算法)

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;
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值