LeetCode 面试题 08.12. 八皇后

一、题目

  设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

  注意:本题相对原题做了扩展

示例:

输入: 4
输出: [[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释: 4 皇后问题存在如下两个不同的解法。
[
[“.Q…”, // 解法 1
“…Q”,
“Q…”,
“…Q.”],
[“…Q.”, // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]

  点击此处跳转题目

二、C# 题解

  经典的 n 皇后题目,使用递归求解如下:

public class Solution {
    public IList<IList<string>> SolveNQueens(int n) {
        IList<IList<string>> ans = new List<IList<string>>();
        Partition(ans, new int[n], 0, 0, n);
        return ans;
    }

    // 递归方法,pos[i] 记录第 i 行皇后的位置
    public void Partition(IList<IList<string>> ans, int[] pos, int i, int j, int n) {
        if (i == n) {
            // 递归出口
            ans.Add(Generate(pos));
            return;
        }
        if (j == n) return;
        if (Check(pos, i, j, n)) {
            // 如果可以放下皇后
            pos[i] = j;                       // 放皇后
            Partition(ans, pos, i + 1, 0, n); // 继续下一行
        }
        Partition(ans, pos, i, j + 1, n); // 继续该行下一个进行判断
    }

    // 检查当前位置 i,j 是否能放皇后
    public bool Check(int[] pos, int i, int j, int n) {
        for (int k = 0; k < i; k++) {
            int difX = j - pos[k], difY = i - k;             // x 差值和 y 差值
            if (difX == 0) return false;                     // 竖向判断
            if (difX == difY || difX == -difY) return false; // 横向判断
        }
        return true;
    }

    // 依据下标位置生成字符串结果
    public IList<string> Generate(int[] pos) {
        IList<string> ans = new List<string>();
        StringBuilder sb  = new StringBuilder(new string('.', pos.Length));
        for (int i = 0; i < pos.Length; i++) {
            sb[pos[i]] = 'Q';
            ans.Add(sb.ToString());
            sb[pos[i]] = '.';
        }
        return ans;
    }
}
  • 时间:116 ms,击败 100.00% 使用 C# 的用户
  • 内存:46.79 MB,击败 95.65% 使用 C# 的用户
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值