//(无用的)读书笔记
//全排列问题(暴力法)
#include <bits/stdc++.h>
using namespace std;
int a[100];
//int b[]={1,1,1};
//打印1到n的全排列
void print_permutation(int n,int *A,int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
{
printf("%d",A[i]);
}
printf("\n");
}else {
for(int i=1;i<=n;i++)
{
bool ok=true;
for(int j=0;j<cur;j++)
{
if(A[j]==i) ok=false;
}
if(ok){
A[cur]=i;
print_permutation(n,A,cur+1);
}
}
}
}
//当含有重复元素会出错
void print_permutation01(int n,int *A,int *B,int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
{
printf("%d",A[i]);
}
printf("\n");
}else {
for(int i=0;i<n;i++)
{
bool ok=true;
for(int j=0;j<cur;j++)
{
if(A[j]==B[i]) ok=false;
}
if(ok){
A[cur]=B[i];
print_permutation01(n,A,B,cur+1);
}
}
}
}
//当含有重复元素也正确,但是会打印出重复的排列
void print_permutation02(int n,int *A,int *B,int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
{
printf("%d",A[i]);
}
printf("\n");
}else {
for(int i=0;i<n;i++)
{
int cnt1=0,cnt2=0;
for(int j=0;j<cur;j++)
{
if(A[j]==B[i]) cnt1++;
}
for(int j=0;j<n;j++)
{
if(B[j]==B[i]) cnt2++;
}
if(cnt1<cnt2){
A[cur]=B[i];
print_permutation02(n,A,B,cur+1);
}
}
}
}
//当含有重复元素也正确,但是不会打印出重复的排列
void print_permutation03(int n,int *A,int *B,int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
{
printf("%d",A[i]);
}
printf("\n");
}else {
for(int i=0;i<n;i++)
if(!i || B[i]!=B[i-1])//比起上面增加的,为了减少重复
{
int cnt1=0,cnt2=0;
for(int j=0;j<cur;j++)
{
if(A[j]==B[i]) cnt1++;
}
for(int j=0;j<n;j++)
{
if(B[j]==B[i]) cnt2++;
}
if(cnt1<cnt2){
A[cur]=B[i];
print_permutation03(n,A,B,cur+1);
}
}
}
}