题目:
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
int n;
const int N = 16;
int st[N];
int path[N];
void dfs(int u)
{
if (u == n) // 当从0开始的时候,其实第一层是不管的,因此
{
// 终止条件就是当 u = n 的时候
for (int i = 0; i < n; i ++)
if (st[i] == 1)
cout << path[i] << " ";
cout << endl;
return ;
}
// 选择这个位置的数
path[u] = u + 1; // 存路径数组
st[u] = 1; // 1表示选择这个数
dfs(u + 1);
// 恢复现场
path[u] = 0;
st[u] = 0; // 0表示这一层还没有被选过
// 不选择这个数
st[u] = 2;
dfs(u + 1);
}
int main()
{
cin >> n;
dfs(0); // 我们先研究有几棵dfs树,很显然,这里只有一棵树
return 0;
}
// 易理解版本
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 16;
int n;
int st[N];
vector<vector<int>> ways;
void dfs(int u)
{
if (u == n + 1)
{
vector<int> way;
for (int i = 1; i <= n; i ++)
if (st[i] == 1) // 如果这一层被选择过
way.push_back(i);
ways.push_back(way); // 注意将每棵树存进一个大的vector中
return ;
}
st[u] = 2; // 不选择
dfs(u + 1);
st[u] = 0;
st[u] = 1; // 选择
dfs(u + 1);
st[u] = 0;
}
int main()
{
cin >> n;
dfs(1);
for (int i = 0; i < ways.size(); i ++) // 我们用一个vector来存有几棵dfs树
{
for (int j = 0; j < ways[i].size(); j ++)// 每棵树的路径
cout << ways[i][j] << " ";
cout << endl;
}
return 0;
}
补充:
1、由数据范围反推时间复杂度
-
2、常见需要记忆数字
2 10 = 1000000 2^{10} = 1000000 210=1000000 10万2 16 = 25536 2^{16} = 25536 216=25536
2 15 = 32768 2^{15} = 32768 215=32768
2 63 = 1000 万 ( 1 0 8 ) 2^{63} = 1000万 (10 ^ 8 ) 263=1000万(108)
-
3、最常见的四个头文件
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;