n皇后问题的递归和迭代版 leetcode N-Queens

题目如下图:

递归版

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<int> dict(n, 0);

        dfs(0, dict, n);

        return res;
    }

private:
    void dfs(int cur, vector<int> & dict, int n)
    {
        if (cur == n)
        {
            fillRes(dict);
            return;
        }
        for (int i = 0; i < n; i++)
        {
            dict[cur] = i;
            if (check(dict, cur))
                dfs(cur + 1, dict, n);
        }
    }

    void fillRes(vector<int> & dict)
    {
        vector<string> tmp;
        for (int i = 0; i < dict.size(); i++)
        {
            string s(dict.size(), ‘.‘);
            s[dict[i]] = ‘Q‘;
            tmp.push_back(s);
        }

        res.push_back(tmp);
    }

    bool check(vector<int> & dict, int cur)
    {
        for (int i = 0; i < cur; i++)
        {
            if (dict[i] == dict[cur] || abs(dict[cur] - dict[i]) == abs(cur - i))
                return false;

        }
        return true;
    }
    vector<vector<string>> res;
};

迭代版

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> res;
        vector<int> nums(n, 0);

        int cur = 0;
        while (cur >= 0)
        {
            if (check(nums, cur))
                cur = cur + 1;
            else
            {
                int carry = 1;
                for (; cur >= 0 && carry != 0;)
                {
                    nums[cur] += carry;
                    if (nums[cur] == n)
                    {
                        nums[cur--] = 0;
                        carry = 1;
                    }
                    else
                    {
                        carry = 0;
                    }

                }
            }
            if (cur == n)
            {
                fillRes(res, nums);
                int carry = 1;
                for (cur--; cur >= 0 && carry != 0;)
                {
                    nums[cur] += carry;
                    if (nums[cur] == n)
                    {
                        nums[cur--] = 0;
                        carry = 1;
                    }
                    else
                    {
                        carry = 0;
                    }
                }
            }
        }

        return res;
    }

private:
    void fillRes(vector<vector<string>> & res, vector<int> & dict)
    {
        vector<string> tmp;
        for (int i = 0; i < dict.size(); i++)
        {
            string s(dict.size(), ‘.‘);
            s[dict[i]] = ‘Q‘;
            tmp.push_back(s);
        }

        res.push_back(tmp);
    }

    bool check(vector<int> & dict, int cur)
    {
        for (int i = 0; i < cur; i++)
        {
            if (dict[i] == dict[cur] || abs(dict[cur] - dict[i]) == abs(cur - i))
                return false;

        }
        return true;
    }
};

  

时间: 2024-08-19 05:55:38

n皇后问题的递归和迭代版 leetcode N-Queens的相关文章

递归和迭代两种方式实现归并排序(Java版)

递归版 package MergeSort; import Utils.SortUtils; /** * 归并排序递归版 * @author liguodong */ public class Demo02 { public static void mergeSort(int[] a){ mSort(a, a, 0, a.length-1); } /** * * @param SR为待排序的数据 * @param TR1为排序之后的数据 * @param s * @param t */ publ

递归与迭代_1 2016.4.21

迭代乃人工,递归方神通 To interate is human,to recurse,divine 一.定义 (1) 迭代 是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果 每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭代的初始值 (2) ① 程序调用自身的编程技巧称为递归( recursion) 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量

单向链表反转算法——递归版和迭代版

最近在做笔试题时,遇到一道编程题:单向链表反转算法.一时紧张,没写出来就提前交卷了,然而交完卷就想出来了... 最初想出来的是递归版,遗憾的是没能做到尾递归,后来又琢磨出了迭代版.后来用实际编译运行测试了一遍,能正常运行. 递归版的灵感来源于<Haskell 趣学指南>中非常简洁的快速排序算法的实现,其思想是将单向链表分割头部和尾部.其中头部指是链表的第一个节点,尾部是指除去第一个节点后的子链表.通过递归的方法,将子链表继续分割成头部和尾部,直至尾部指剩下一个节点,无法继续分割,然后将头部和尾

【万字博文】分析与设计:插入排序和分治算法、递归和迭代的探讨

插入排序及其解决思路 算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的. 就像编程语言中的"Hello World!"程序一般,学习算法一开始学的便是排序算法.排序问题在日常生活中也是很常见的,说得专业点: 输入是:n个数的一个序列<a1,a2,...,an?1,an> 输出是:这n个数的一个全新的序列<a,1,a,2,...,a,n?1,a,n>,其特征是a,1≤a,2≤...≤a,n?1≤a,n 举

【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层

递归和迭代 这两个概念也许很多童鞋依旧分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧. 斐波那契数的定义: f0=0 f1=1 fi=fi?1+fi?2(i>1) 递归: (factorial 6) (* 6 (factorial 5)) (* 6 (* 5 (factorial 4))) (* 6 (* 5 (* 4 (factorial 3)))) (* 6 (* 5 (* 4 (* 3 (factorial 2))))) (* 6 (* 5 (* 4 (* 3 (2 (factori

递归与迭代_2 2016.4.22

八.递归消除 按照递归的思想可使我们得以从宏观上理解和把握应用问题的实质 深入挖掘和洞悉算法过程的主要矛盾和一般性模式 并最终设计和编写出简洁优美且精确紧凑的算法 然而,递归模式并非十全十美,其众多优点的背后也隐含着某些代价 (1)空间成本 首先,从递归跟踪分析的角度不难看出,递归算法所消耗的空间量主要取决于递归深度 故较之同一算法的迭代版,递归版往往需耗费更多空间,并进而影响实际的运行速度 另外,就操作系统而言,为实现递归调用需要花费大量额外的时间以创建.维护和销毁各递归实例,这些也会令计算的

中序遍历-----二叉查找树的遍历(迭代版,不使用栈或者队列)

二叉查找树(Binary Search Tree)的遍历的方法有很多,通常使用的是递归的遍历,其便于理解,但是使用递归的话会造成程序运行的空间浪费,效率并不高.为此可以使用一个栈来模拟递归的过程,实现迭代版的二叉查找树的遍历.但是会使用到额外的存储空间,虽说在运行效率上比递归版的有所提高,但是额外的存储空间还是一定的浪费.但是如何减少额外的存储空间呢?我们知道二叉查找树是可以转换为一个双向环形链表(二叉查找树与双向环形链表的转化),而链表的遍历是不需要额外的空间的,因此我们可以考虑通过充分利用树

递归和迭代(Recursion and Iteration)

递归 特点:简而言之,递归就是应用程序调用自身.所以,存在预期收敛,才能使用递归(因为不能无限期递归调用下去). 优点:程序看着比较简单,比较容易实现. 缺点:递归要占用额外的栈空间,如果递归的深度比较大,那么占用的栈比较多,而且调用函数的时间也比较多,时空性都不好. 所以选择递归要考虑好处和缺点之间的权衡. 迭代 特点:通过步号寻找需要的信息,经典的例子比如C++中的for循环语句(迭代遍历程序). 优点:开销只因循环的增加而相应增加,没有额外的空间开销和时间开销. 缺点:编写复杂问题时可能程

递归与迭代【转】

1 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 1.1 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身: 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 1.2 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解: 2