算法笔记
1.在调用函数后记得用return进行释放:
#include<iostream>
using namespace std;
int n, m;
void dfs(int u, int sum, int state){
if (sum + n - u < m)return;
if (sum == m){
for (int i = 0; i < n; i ++)
if (state >> i & 1 )
cout << i + 1 << ' ';
cout << endl;
return;//未加return会造成Segmentation Fault
}
dfs(u + 1, sum + 1, state | 1 << u);
dfs(u + 1, sum, state);
}
int main(){
cin >> n >> m;
dfs(0, 0, 0);
2.#include < vector >使用
#include<iostream>
#include<vector>
using namespace std;
int n;
//int path[10]={0};
vector<int> path;
void dfs(int u, int state){
if (u == n){
/*
for (int i = 0; i < n; i ++)
cout << path[i] << ' ';
*/
for (auto x : path) cout << x << ' ';
cout << endl;
return;
}
for (int i = 0; i < n; i ++){
if (!(state >> i & 1)){
path.push_back(i + 1);
//path[u] = i + 1;
dfs(u + 1, state | 1 << i);
path.pop_back();//将最后一个元素出栈
}
}
}
int main(){
cin >> n;
dfs(0,0);
return 0;
}
原代码中关于vector数组的用法与注释中用法起了相同的作用.
vector数组的有点在于可以动态分配数组空间,不造成浪费,在中间插入和删除慢,在首位末端插入和删除快。