[AcWing]AcWing 843. n-皇后问题(C++实现)

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 读题(需要重点注意的东西)

思路:全排列的思想,在每一行中,判断这列col、斜线dg,反斜线udg是否存放了queen,如果存放了,就不能再放了;否则可以放,然后将其对应的col、dg、udg都置为true,表示已经放了一个queen了。

3. 解法

---------------------------------------------------解法---------------------------------------------------

#include <iostream>
using namespace std;
const int N = 20; 

// col列,dg斜线,udg反斜线
// g[N][N]用来存图

int n;
char g[N][N];
bool col[N], dg[N], udg[N];

void dfs(int u) {
    if (u == n) {
        for (int i = 0; i < n; i ++ ) puts(g[i]);
        puts("");  // 换行
        return;
    }

    for (int i = 0; i < n; i ++ )
        if (!col[i] && !dg[u + i] && !udg[n + u - i]) {
            g[u][i] = 'Q';
            col[i] = dg[u + i] = udg[n + u - i] = true;
            dfs(u + 1);
            col[i] = dg[u + i] = udg[n + u - i] = false; // 恢复现场
            g[u][i] = '.';

        }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n; j ++ )
            g[i][j] = '.';

    dfs(0);

    return 0;
}

可能存在的问题

  1. 递归思想

    如果对上述代码中递归思想有不理解的同学,可以参考下文 4. 可能有帮助的前置习题

  2. dg、udg下标怎么选择的?
    最重要的就是理解,dg[ b ] ,对于每个点,算出来b相同的点,是在同一条斜线或者反斜线上的。b表示的是这条斜线或反斜线的截距

    dg[ b ]、udg[ b ]表示一条对角线,其中 b 是截距dg与udg数组表示:具有相同截距的点,在同一条对角线上

    那么关键是这个 b 的值如何选择呢?

    给定了这个点的 i 和 u,画图得到
    在这里插入图片描述

    因此,

    1. 对于dg,可以算出b = u - i
      因为可能存在负数,而数组下标不能是负数,因此给了一个偏移量n
      最后得到 b = n + u - i;
    2. 对于udg,b = u + i
      对应在代码中为
     if (!col[i] && !dg[u + i] && !udg[n + u - i]) 
    

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

6. 总结

dfs的应用之一,推荐在理解dfs的思想的基础上,好好的理解并掌握递归的思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cloudeeeee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值