美文网首页
02用DFS实现全排列

02用DFS实现全排列

作者: HelloSam | 来源:发表于2020-03-14 23:03 被阅读0次
#include <iostream>
using namespace std;

const int N = 10; //能对10个数进行全排列,比如n=3,就是对123全排列,N是一共有N个坑,n=3这种情况只占了3个坑
int n;
int path[N];//存一下全排列的路径,即每个坑里面是什么数字
bool flag[N]; //某个数用过没

void dfs(int u)
{
    if (u==n+1) //n个数就是n个位置,对位置里面填数进行遍历,把数填到了位置n就把一种情况枚举完了,这里不能写n,因为n位置还没赋值,是到了n+1个位置了,说明前n个位置遍历完了
    {
        for (int i=1;i<=n;i++)
        {
            cout << path[i] << " ";
        }
        cout << endl;
        return;
    }
    else 
    {
        for (int i=1;i<=n;i++)
        {
            if (flag[i]==false) //如果这个数字没用过就把这个数字填到传进来的这个位置上,这句话是后写的,先写的里面的内容,发现逻辑上有问题需要先判断数字有没有用过,再把这个数字填上,所以加了一个判断
            {
                path[u] = i; //比如第1个位置先放上1
                flag[i] = true; //那么数字1就用过了
                dfs(u + 1);//对下一个位置再遍历,比如到了第2个位置,这句话走完,因为是一个递归的过程,出口在上面的if(u==n+1)的 时候,所以这时候就已经枚举完一种情况了,所以要回复现场
                path[u] = 0; //没进来的时候什么样,恢复完什么样
                flag[i] = false;
            }
        }
    }
}

//对位置进行深度遍历
int main()
{
    cin >> n; //1-n 做全排列
    dfs(1); //先填第一个位置上的数,对第一个位置进行深度遍历,这里要是写1的话,这个path就0号位置不要了

    return 0;
}
#include<iostream>
using namespace std;

//思路就是对位置进行深度搜索
const int N = 10;
int path[N];
int n;
bool flag[N]; //10个数字是否被用过的标记

void dfs(int p)
{
    if(p==n+1) 
    {
        for(int i=1;i<=n;i++) cout << path[i] <<" ";
        cout<<endl;
    }

    for (int i = 1; i <= n; i++)
    {
        if(flag[i]==false)
        {
            path[p] = i;
            flag[i] = true;
            dfs(p+1);
            path[p] = 0;
            flag[i] = false;
        }
    }
}s

int main()
{
    cin >> n; //对1-n进行全排列
    dfs(1); //从第1个位置开始深度遍历    
    return 0;
}

相关文章

  • 02用DFS实现全排列

  • 02用DFS实现

  • 全排列(DFS解法)

    题目链接[https://www.acwing.com/problem/content/844/] 回溯的时候,需...

  • 46. Permutations

    Description 找到数组全排列 Solution 暴力dfs with sortTime O(N! *N ...

  • leetcode指北---DFS

    DFS,也就是深搜,实质就是枚举。如果题目问的是一共多少种方法,多少种排列...尽管用。 全排列问题: 全排列:给...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 全排列&下一个字典序&上一个字典序问题(C++)

    1、用递归(DFS)和非递归两种方式输出一个序列的全排列;2、找到当前序列的下一个和上一个字典序。 全排列和字典序...

  • 全排列与全组合

    递归+交换值实现全排列 非重复的全排列 位运算实现全组和

  • 2020-04-02 刷题1(字符串)

    字符串的全排列 用set去重。全排列用dfs来做,将当前字符串分为两部分,第一部分是第一个字符,其子问题为将第一个...

  • 排列

    0X00 模板题目 46. Permutations 很典型的「排列模板题目」用 dfs 生成所有排列, 通常使用...

网友评论

      本文标题:02用DFS实现全排列

      本文链接:https://www.haomeiwen.com/subject/astashtx.html