-
1、全排列问题 【问题描述】 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 【输入格式】 n(1≤n≤9) 【输出格式】 由1~n组成的所有不重复的数字序列,每行一个序列。 【输入样例】Form.in 3 【输出样例】Form.out 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 解题分析: 联想到啊哈算法中有关小哈在盒子里放扑克牌的模型即可轻松求解, 也就是说,用step表示当前啊哈站在的盒子的面前,i表示的是手中的第 i号牌,那么vis[i]表示的则是手上的第i张牌有没有被放进盒子里的状态 a[step] = i则表示将第i张牌放到当前小哈所走到的盒子面前 */ # include<cstdio> # include<iostream> using namespace std; int a[11]; int vis[11]; int n; int total; void dfs( int step ) { if ( step == n+1 ) { total++; for ( int i = 1;i <= n;i++ ) cout<<a[i]<<" "; cout<<endl; return; } for ( int i = 1;i <= n;i++ ) { if ( vis[i] == 0 ) { a[step] = i; vis[i] = 1; dfs(step+1); vis[i] = 0; } } } int main(void) { cin>>n; dfs(1); cout<<"total = "<<total<<endl; return 0; }
-