halisi7

一个专注技术的组织

0%

dfs(深搜)数的全排列-c语言

dfs的解决问题的思路:

  1. 先解决当下该如何做。
  2. 然后再考虑下一步如何做。

问题:

  • 输入一个数n,输出1~n的全排列。

分析:

形象化问题:

​ 假如有编号为1,2,3的三张扑克牌和编号为1,2,3的三个盒子。

​ 现在需要将3张扑克牌分别放到3个盒子里,每个盒子只能放一张。

Snipaste_2022-01-12_11-33-26

  • 约定一个顺序:每当需要输出一个数时,总是先输出1,然后是2,其次是3。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
int a[10], book[10], n;//c语言的全局变量在没有赋值以前默认值是0 !

void dfs(int step) {//step表示第几个盒子
int i;//一定要定义在内部,不能定义为全局变量,因为要在内部使用。
if (step == n + 1) {//如果没盒子了
for (i = 1; i <= n; i++) {
printf("%d ", a[i]);

}
printf("\n");
return;//表示返回上一步!!
}
for (i = 1; i <= n; i++) {
if (book[i] == 0) {//如果牌i还在的话
a[step] = i;//将i扑克牌放在第step个盒子里
book[i] = 1;//给牌i做标记,标记已经用过了
dfs(step + 1);//下一个盒子
book[i] = 0;//将刚才尝试的扑克牌收回,然后再进行下一次

}


}

return;
}
int main() {

printf("请输入有几个数:");
scanf_s("%d ", &n);

dfs(1);//首先站在1号盒子前

getchar(); getchar();
return 0;
}

总结:

  • dfs—先解决第一步怎么办,第二步就是重复第一步即可。
打赏一下作者~ ฅ( ̳• ◡ • ̳)ฅ