递归方法求不重复排列

来源:互联网 发布:软件测试 培训 推荐 编辑:程序博客网 时间:2024/06/10 03:42
/*******************************************************************\输入n个数,输出由这n个数构成的排列,不允许出现重复的项输入:31 1 2输出:1 1 21 2 12 1 1思路:先手工模拟排列的过程,在第三个排列2 1 1中,我们之所以能够写出来,是因为我们能发现1和2是不同的数,而计算不能,因此在存储数据的时候数组中不能有重复的数据,因此存储的数比实际的数据个数要少,因此要用辅助数组记录每个元素的个数,这样就能利用不含重复元素的排列算法求解.\*******************************************************************/#include<stdio.h>#include<string.h>#include<assert.h>const int maxn = 100;int num[maxn];int used[maxn];int ans[maxn];int n, m;int readdata(){memset(used, 0, sizeof(used));memset(num, 0, sizeof(num));memset(ans, 0, sizeof(ans));int i = 0, j = 0;if(scanf("%d", &n) == EOF || n <= 0)return false;int val = 0;for(i=0; i<n; i++){scanf("%d", &val);for(j=0; j<m; j++){if(num[j] == val){used[j]++;break;}}if(j == m){num[m] = val;used[m] = 1;m++;}}return true;}void output(){for(int i=0; i<n; i++){if(i < n-1)printf("%d ", ans[i]);elseprintf("%d\n", ans[i]);}}void unrepeatPerm(int dep){if(dep >= n){output();return;}for(int i=0; i<m; i++){/*最好是手写模拟递归过程,其中num数组中存储的是不同的元素,这也是关键,*/if(used[i] > 0)/*此处是重点*/{used[i]--;ans[dep] = num[i]; unrepeatPerm(dep+1);used[i]++;}}}int main(){while(readdata()){unrepeatPerm(0);}return 0;}

原创粉丝点击