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,多做点题目找找感觉吧- -


相关文章
|
4天前
|
Java
hdu1716 排列2(暴力法)
hdu1716 排列2(暴力法)
18 0
|
4天前
|
算法 搜索推荐
每日一题——下一个排列
每日一题——下一个排列
|
4天前
|
容器
leetcode-31:下一个排列
leetcode-31:下一个排列
27 1
|
9月前
|
人工智能 BI
牛客 序列排列1
牛客 序列排列1
41 0
|
9月前
|
容器
LeetCode-31 下一个排列
LeetCode-31 下一个排列
|
10月前
|
移动开发 算法
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
76 0
|
11月前
剑指offer 39. 数字排列
剑指offer 39. 数字排列
54 0
|
11月前
|
算法 索引
leetcode:31.下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
43 0
|
算法 容器
LeetCode 31. 下一个排列
LeetCode 31. 下一个排列
85 0
LeetCode 31. 下一个排列
|
算法 Java C++