题目解答
分析:
dfs求全排列,这里是用二进制状态压缩进行优化,二进制状态压缩,顾名思义,每个状态是用二进制的某一位表示。这里的体现是state这个状态,它的每一位代表1个数被选了。比如state = 5,二进制表示是101,这就表示1和3被用了,2却没有被用。
ac代码
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> path;
// state的二进制 表示哪些数被用过了,比如 state = 3,二进制是11,表示1和2用过了
void dfs(int u , int state){
if( u == n){
for(auto x : path) cout << x << " ";
cout << endl;
return;
}
// 当前位置该选哪个数
for(int i = 0; i < n; i++){
// 当前i没用过,就把它加到path中
if(!(state >> i & 1)){
path.push_back(i + 1);
dfs( u + 1, state | 1 << i);// dfs转移,后面表示i这位用过了
// 恢复现场
path.pop_back();
}
}
}
int main(){
cin >> n;
dfs(0, 0);
}