P1562 还是 N 皇后

P1562 还是 N 皇后

暴力很简单, 无法通过本题, 但是从简单的暴力中可以发现 :

  • 每列只能放一个
  • 每行只能放一个
  • 每条从左至右对角线只能放一个
  • 每条从右至左对角线只能放一个

第一点, 每行的限制, 可以一行一行的考虑每行棋子的位置, 每行只放一个,就只用考虑后三个的限制


正解方法, 用 \(0\) 表示一个位置可以放, 用 \(1\) 表示一个位置不能放, 这样的二进制数来表示每一行的能否放置

记录四个点

  • 1. 记录当前是第几行
  • 2. 记录对于当且列的限制来说,哪些位置不可以放, (一个皇后会攻击同列的,所以用以个量来记录每一列的放置状况,所以可以把这个放置状况直接传下去,用于快速得到哪些位置可以放)
  • 3. 记录从右到左的对角线的限制状况(它传递的方式不同,要把限制往左移一位,比如当前行放在了 \(3\) 号位, 那么它就可以攻击到下一行的 \(2\) 号位, 下下行的 \(1\) 相当于就是把限制左移一位然后传递给下一行)
  • 4. 记录从左到右的对角线的限制情况, 和上面一样,但是它是往右移一位

以上限制,记录的都是哪些位置不能放


\(dfs\) 的流程 :
如果所有行都已经放置完成
\(\;\;\;\;\;\;\)答案方案数 \(+1\) 然后返回
然后每一行的可放置状态 \(=\) 题目本身有的限制 \(\&\) 左限制的取反 \(\&\) 右限制取反 \(\&\) 列限制取反

取反是因为记录的是不能放的位置,取反后就是能放的位置

然后对于这个当前可放置位置的值,遍历每一个能放的位置, 尝试放置, 往下递归


完了

posted @ 2025-12-12 22:20  wmq2012  阅读(11)  评论(0)    收藏  举报