dfs的解决问题的思路:
- 先解决当下该如何做。
- 然后再考虑下一步如何做。
问题:
分析:
形象化问题:
假如有编号为1,2,3的三张扑克牌和编号为1,2,3的三个盒子。
现在需要将3张扑克牌分别放到3个盒子里,每个盒子只能放一张。
- 约定一个顺序:每当需要输出一个数时,总是先输出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;
void dfs(int 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) { a[step] = i; book[i] = 1; dfs(step + 1); book[i] = 0; } } return; } int main() { printf("请输入有几个数:"); scanf_s("%d ", &n); dfs(1); getchar(); getchar(); return 0; }
|
总结:
- dfs—先解决第一步怎么办,第二步就是重复第一步即可。