题目描述
把 1∼n 这 n(n<10)个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入描述:
一个整数n。

输出描述:
按照从小到大的顺序输出所有方案,每行1个。 首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

思路
因为这题是按照字典序,所以优先考虑来发深搜。还需判断这个数字是否被使用过,用深搜常见的vis数组,还可以用bool值来判断,也可以用一个整数来判断。一个整数来代替vis数组,可以大大减少空间复杂度。

C++完整AC代码

#include <iostream>
#include <vector>

using namespace std;

int N;
vector<int> a;//名称无所谓了,只要自己明白是什么即可

void dfs(int n,int state) {//state表示每一种状态,跟用bool值来表示的作用是一样的

    if (N == n) {
        for (auto i:a) 
            cout << i << ' ';
        cout << endl;
        return ;
    }

    for (int i = 0; i < N; i++) {
        if (!(state >> i & 1))
        {
            a.push_back(i + 1);
            dfs(n + 1, state | (1 << i));
            a.pop_back();
        }
    }

    }

int main() {
    cin >> N;
    dfs(0, 0);

    return 0;
}