N皇后问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、题目·

二、使用步骤

1.思路

2.代码

总结


前言

提示:这里可以添加本文要记录的大概内容:

12月24日练习内容


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目·

N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。

数据范围: 1≤n≤9

要求:空间复杂度O(1) ,时间复杂度 O(n!)

例如当输入4时,对应的返回值为2,

对应的两种四皇后摆位如下图所示:

N皇后问题_第1张图片

 

二、使用步骤

1.思路

  • step 1:对于第一行,皇后可能出现在该行的任意一列,我们用一个数组pos记录皇后出现的位置,下标为行号,元素值为列号。
  • step 2:如果皇后出现在第一列,那么第一行的皇后位置就确定了,接下来递归地在剩余的n−1n-1n−1行中找n−1n-1n−1个皇后的位置。
  • step 3:每个子问题检查是否符合条件,我们可以对比所有已经记录的行,对其记录的列号查看与当前行列号的关系:即是否同行、同列或是同一对角线。

2.代码

代码如下(示例):


class Solution {
  public:
    /**
     *
     * @param n int整型 the n
     * @return int整型
     */
    //判断皇后是否存在
    bool isValid(vector& res, int r, int c) {
        //遍历所有已经记录的行
        for (int i = 0; i < r; i ++) {
            //不能同行同列同一斜线
            if ( r == i || c == res[i] || abs(r - i) == abs(c - res[i]))
                return false;
        }
        return true;
    }
    void pre(int n, int r, vector& res, int& temp) {
        //完成全部行都选择了位置
        if (r == n) {
            temp++;
            return;
        }
        //遍历所有列
        for (int i = 0; i < n; i ++) {
            if (isValid(res, r, i)) {
                res[r] = i;
                pre(n, r + 1, res, temp);
            }
        }
    }
    int Nqueen(int n) {
        // write code here
        int res = 0;
        vector v(n, 0);
        pre(n, 0, v, res);
        return res;
    }
};


总结

提示:这里对文章进行总结:
 

你可能感兴趣的:(C++,算法,c++,数据结构,深度优先)