Acwing 823.排列

简介: Acwing 823.排列

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

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

输入格式

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

输出格式

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

数据范围

1≤n≤9

输入样例:

3

输出样例:

1. 1 2 3
2. 1 3 2
3. 2 1 3
4. 2 3 1
5. 3 1 2
6. 3 2 1


问题分析:这是一道DFS的题目 借用大佬的图


对此展开分析:


2d39f22977ba224773dcf791aa67ef2e.jpg


vis[i]用于标记数组,p[i](position)用于记录第i位(从左往右)上的数字是什么


那么对于n = 3,我们从第一个位置(u)开始枚举,dfs(1)


遍历 1—3,选取一个数,如果这个数没被访问过,那么把这个位置填入第1(u)个位置,同时标记这个数字已访问,继续搜第二个位置dfs(2)...


当dfs(2)搜完了以后,代表第一个位置是1(假设是1)的所有情况已经枚举完了,此时需要标记上一步即第一个位置的数字未访问,为的是后来能够再次用到这个数字;


基线条件:当u=n+1,说明1—n位置都有数字填进去了,那么把它输出就可以了;


注意,因为要按字典序输出升序,所以每次在遍历的时候,从1到9这样的顺序考虑就好了


#include <iostream>
using namespace std;
int n;
int vis[10];
int p[10];
void dfs(int u)
{
    if (u==n+1)
    {
        for (int i =1;i<=n;i++) cout<<p[i]<<" ";
        cout<<endl;
    }
    else
    {
        for (int i =1;i<=n;i++)
        {
            if (!vis[i])
            {
                p[u] = i;
                vis[i] = 1;
                dfs(u+1);
                vis[i] = 0;
            }
        }
    }
}
int main()
{
    cin >>n;
    dfs(1);
    return 0;
}

还是感觉深搜有点不太好理解qwq,多做点题目找找感觉吧- -


相关文章
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
2月前
|
算法 C++ 容器
Leetcode第三十一题(下一个排列)
这篇文章介绍了LeetCode第31题“下一个排列”的C++解决方案,该算法通过原地修改数组来找到下一个字典序更大的排列,如果不存在则重排为字典序最小的排列。
35 0
Leetcode第三十一题(下一个排列)
|
7月前
|
容器
leetcode-31:下一个排列
leetcode-31:下一个排列
63 1
|
7月前
|
算法 搜索推荐
每日一题——下一个排列
每日一题——下一个排列
|
7月前
leetcode-441:排列硬币
leetcode-441:排列硬币
67 0
|
7月前
|
算法
【剑指offer】-字符串的排列-26/67
【剑指offer】-字符串的排列-26/67
LeetCode 算法 | 如何排列硬币?
LeetCode 算法 | 如何排列硬币?
|
移动开发 算法
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
115 0
|
算法 索引
leetcode:31.下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
57 0