1.全排列

分析:

这个题考查我们全排列,全排列即固定一位,往后依次列举其他位

可能性列举完毕后此数位换下一个数字列举

显然,这是一个栈的数据结构(先进后出)

所以我们可以用深搜来解决这道题

 

具体题意:

深搜参数为位数,定义一个答案桶存放;

通过DFS及其回溯来列举出所有的可能性

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stack>
 4 using namespace std;
 5 bool vis[50];
 6 int N;
 7 int ans[50];
 8 //为什么只输出一个答案??
 9 void print()
10 {
11     for(int j=1;j<=N;j++)
12     {
13         printf("%5d",ans[j]);
14     }
15     cout<<endl;
16 }
17 
18 void DFS(int step)
19 {
20     if(N<step)print();
21 else
22 {
23 
24     for(int i=1;i<=N;i++)
25     {
26         if(vis[i]==0)
27         {
28             vis[i]=1;
29             ans[step]=i;//存答案
30             DFS(step+1);
31             vis[i]=0;//因为回溯,i是更新的,可能大变小,所以得重新设置
32                     //int j每次循环都开一个新j(九个数九个j) 每层递归的j都不一样
33                     //如果每层都开一个新i,则不同的i作用域不同
34                     //如果开全局变量的i,则回溯时的i不一定作用域是谁
35         }
36     }
37 }
38 }
39 int main()
40 {
41     cin>>N;
42     DFS(1);
43     return 0;
44  }

 

posted @ 2022-08-23 15:14  要不要吃哈密瓜  阅读(94)  评论(0编辑  收藏  举报