还是向别人学习的 一道题目,是算法课后作业,时间关系,只能向别人请教了。
设R={ r1, r2, ……, rn }是要进行排列的n个元素。其中元素r1 ,r2 ,……,rn可能相同。试设计一个算法,列出R的所有不同排列。 给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
输入数据的的第1行是元素个数n,1≤n≤500。接下来的1行是待排列的n个元素。
将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数。
#include <iostream> #include <algorithm> #include <cstdio> using namespace std ; long long ans; int ok(char str[],int a ,int b ) { if(b>a) for(int i=a;i<b;i++) if(str[i]==str[b]) return 0; return 1; } void perm(char str[],int k,int m) { int i; if(k==m) { ans++; for(i=0;i<=m;i++) printf("%c",str[i]); printf("\n"); return ; } else for(i=k;i<=m;i++) if(ok(str,k,i)) { swap(str[k],str[i]); perm(str,k+1,m); swap(str[k],str[i]); } } int main() { char str[505]; int n,i; scanf("%d",&n); getchar(); ans=0; for(i=0;i<n;i++) scanf("%c",&str[i]); perm(str,0,n-1) ; printf("%lld\n",ans); return 0; }