说明:不重复排列:指的是排列当中没有重复的序列,不是说里面的元素没有重复。
附加规则:针对:1 2 2 3 4 5(六个数字)
1、数字4 不能放在第三位置上。
2、数字3 和 数字5 不能相邻(不包括首尾)。
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a) #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n,m,cnt,used[10],rcd[6],a[10]; void init() { m=cnt=0; mem(rcd,0); mem(used,0); } void dfs(int l) { if(l==n) { for(int i=0;i<n;i++) printf("%d ",rcd[i]); puts(""); cnt++; return; } for(int i=0;i<m;i++) { if(used[i]>0 && !(a[i]==4&&l==2)) // used[i]还有个数 && 数字4 不能放在第三个位置上 { // 数字5 和 数字3 不能相邻,不包括首尾 if(l-1>=0&&a[i]==5&&rcd[l-1]==3 || l-1>=0&&a[i]==3&&rcd[l-1]==5) continue; used[i]--; rcd[l]=a[i]; dfs(l+1); used[i]++; } } } int main() { while(~scanf("%d",&n)) { init(); int val,j; for(int i=0;i<n;i++) { scanf("%d",&val); for(j=0;j<m;j++) { if(a[j]==val) { used[j]++; break; } } if(j==m) a[m]=val,used[m++]=1; } dfs(0); printf("cnt == %d\n",cnt); } return 0; }