DFS 之 全排列

题目描述

给定一个整数 n,将数字 1 ∼ n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围: 1 ≤ n ≤ 7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

https://www.acwing.com/problem/content/844/ 

思路:

  • dfs深度优先遍历的思想比较简单,就是一条路走到底,走到最深点处再回退一步,再看有没有路可以走,没有的话再回退一步,重复此步骤
  • 用 path 数组保存排列,当排列的长度为 n 时,是一种方案,输出
  • 用 state 数组表示数字是否用过。true则已经用过
  • dfs() 表示的含义是:从第0层开始填写数字,然后递归的在下一个位置填写数字
  • 回溯:第 i 个位置填写某个数字的所有情况都遍历后, 第 i 个位置填写下一个数字
    #include<iostream>
    
    using namespace std;
    
    const int N = 10;
    int path[N];
    bool st[N];//标注数字是否被用过
    int n;
    
    void dfs(int x)
    {
        if(x == n)//数字填完了,输出
        {
            for(int i = 0; i < n; i ++)  printf("%d ", path[i]);
            puts("");
            return;
        }
        
        for(int i = 1; i <= n; i ++)//这里是空位上可以选择的数字为:1 ~ n
        if(!st[i])//如果数字 i 没有被用过
        {
            path[x] = i;//放入空位
            st[i] = true;//放入空位,则数字被用,修改状态
            dfs(x + 1);//填下一个位
            st[i] = false;//回溯,恢复现场,数字i后续可用
        }
    }
    
    int main()
    {
        cin >> n;
        dfs(0);// 在path[0]处开始填数
        
        return 0;
    }

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值