简单的全排列问题(给初学者)

题目描述

输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入输出格式

输入格式:

 

n(1≤n≤9)

 

输出格式:

 

由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。

输入输出样例

输入样例#1: 复制
3
输出样例#1: 复制
    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

 

深搜;print为输出函数,%5d就是题目要求 每个数字占五个长宽,
dfs深搜,if(!a[i])是如果它等于0的意思,dfs(x+1)后面的a[i]=0为回溯,

执行这个的条件是当for循环完了还不满足if(x==n)是,就执行这一句回溯,
(可以自己调试看看),回溯后返回上一层,

也就是x,回溯前是x+1,回溯后是x,可以理解为x+1-1,-1就代表回溯到上一步,
然后main函数里的dfs(0),为什么是0?

对于dfs,可以先0,先1,先x……都可以,根据自己的代码来,这里从零开始,
跳到dfs函数,那么x就等于0,然后紧接着x+1就等于1,b[x+1]=i;

也就是b[1]=i是刚好的,如果dfs(1),那x+1就等于2,那就错了。
嗯,,,一开始我也很绝望,,真的看不懂,现在好像也还有点儿,,,我把我

难理解的写出来了,仅仅是给新手看的。


我太,,lj了。。。


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,b[11];
 8 bool a[233];
 9 void print()
10 {
11   for(int i=1;i<=n;i++)
12     printf("%5d",b[i]);
13   cout<<endl;
14 }
15 void dfs(int x)
16 {
17   int i;
18   if(x==n)
19   {
20     print();
21     return ;
22   }
23   for(int i=1;i<=n;i++)
24   {
25     if(!a[i])
26     {
27       a[i]=1;
28       b[x+1]=i;
29       dfs(x+1);
30       a[i]=0;
31     }
32   }
33 } 
34 int main()
35 {
36   scanf("%d",&n);
37   for(int i=1;i<=n;i++)
38     b[i]=i;
39   dfs(0);
40 
41   return 0;
42 
43 }

如果你不开心,那我就把右边这个帅傻子分享给你吧, 

你看,他这么好看,那么深情的望着你,你还伤心吗? 

真的!这照片盯上他五秒钟就想笑了。 

一切都会过去的。



原文地址:https://www.cnblogs.com/Mary-Sue/p/8545420.html