说明:不重复排列:指的是排列当中没有重复的序列,不是说里面的元素没有重复。
附加规则:针对:1 2 2 3 4 5(六个数字)
1、数字4 不能放在第三位置上。
2、数字3 和 数字5 不能相邻(不包括首尾)。
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;
}