题目描述
把 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;
}
京公网安备 11010502036488号