全排列问题
题目描述:
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入
n(1≤n≤9)
输出
由1~n组成的所有不重复的数字序列,每行一个序列。(每一个数占5个字符)
样例输入
3
样例输出
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
解决过程:
#include<bits/stdc++.h> using namespace std; int a[15],b[15]; int n,i; int dfs(int); int main() { cin>>n; for(i=1;i<=n;i++) a[i]=i; dfs(0); return 0; } int dfs(int weishu) { if(weishu==n) { for(i=1;i<=n;i++) cout<<setw(5)<<a[i]; cout<<endl; return weishu--; } weishu++; for(int j=1;j<=n;j++) if(b[j]==0) { a[weishu]=j; b[j]=1; dfs(weishu); b[j]=0; } }
代码自己看,当时随便写的,没怎么下功夫
我就强调一点(真)
最后一个for循环里j=1前面一定要加int
我的理解是:
如果不加的话j调用的是全局变量
但如果是加了int的话,调用的是局部变量
换句话说,调用几次就有几个j
每个j都不相关联
但如果不加int
就一共只有一个j,后面的j的改变会影响前面的回溯与归零(b[j]=0;)
一点要注意,耽误了我好长时间(-_-||)