一、数字全排列
小哈面前有三个箱子,手上有1,2,3三张牌,规定能放小牌就放小牌,小哈放完最后一个箱子后,最后在箱子的牌能有几种排列?
二、代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int a[N];
bool st[N];
int n = 3;
//函数说明:填充第几个盒子
void dfs(int step) {
//如果全部填充完毕,走到了最后虚拟的n+1号盒子面前,就表示前面都完成了正确填充
if (step == n + 1) {
for (int i = 1; i <= n; i++) cout << a[i] << " ";
cout << endl;
return;
}
//每一个数字都可以用来填充
for (int i = 1; i <= n; i++)
//如果没有使用过
if (!st[i]) {
//放里
a[step] = i;
//标识已使用
st[i] = true;
//填充下一个
dfs(step + 1);
//标识未使用
st[i] = false;
}
}
int main() {
//开始填充第一个盒子
dfs(1);
return 0;
}
三、[][][] + [][][] = [][][] 问题
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int a[N];
bool st[N];
void dfs(int step) {
if (step == 10) {
if ((a[1] * 100 + a[2] * 10 + a[3]) + (a[4] * 100 + a[5] * 10 + a[6]) == a[7] * 100 + a[8] * 10 + a[9]) {
for (int i = 1; i <= 9; i++) printf("%d ", a[i]);
printf("\n");
}
}
for (int i = 1; i <= 9; i++) {
if (!st[i]) {
a[step] = i;
st[i] = true;
dfs(step + 1);
st[i] = false;
}
}
}
int main() {
dfs(1);
return 0;
}
五、套路总结
深度优先搜索的基本模型
void dfs(int step)
{
//1、判断边界.收集结果
//2、尝试每一种可能
for(i=1;i<=n;i++){
//继续下一步
dfs(step+1);
}
}