题目描述
把 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; }