题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入输出格式
输入格式:
n(1≤n≤9)
输出格式:
由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。
输入输出样例
深搜;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 }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。