您的位置:首页 > 其它

生成全排列的一些方法

2014-04-28 09:56 232 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int A[100];
//int P[100] = {1, 2, 2, 4, 5, 6, 6, 8, 9, 10};
//int P[100] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
char P[100];
void print_subset(int n, int s)
{
for(int i = 0; i < n; i++)
if(s & (1 << i))
printf("%d ", i);
printf("\n");
}
void solve()
{
for(int i = 1; i < (1<<n); i++)
print_subset(n, i);
}
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 = 0; i < n; i++)
{
int ok = 1;
for(int j = 0; j < cur; j++)
if(A[j] == P[i])
ok = 0;
if(ok)
{
A[cur] = P[i];
print_permutation(n, A, cur+1);
}

//int c1 = 0, c2 = 0;
//for(int j = 0; j < cur; j++) if(A[j] == P[i]) c1++;
//for(int j = 0; j < n; j++) if(P[j] == P[i]) c2++;
//if(c1 < c2)
//{
// A[cur] = P[i];
// print_permutation(n, A, cur+1);
//}
}
}
void print_permutation1()
{
sort(P, P+n);
do
{
for(int i = 0; i < n; i++)
printf(i == n-1 ? "%d\n" :"%d ", P[i]);
} while (next_permutation(P, P+n));
}
void print_permutation2(int n, int*A, int cur, int set)
{
if(cur == n)
{
for(int i = 0; i < n; i++)
printf(i == n-1 ? "%c\n" :"%c ", P[A[i]]);
}
else for(int i = 0; i < n; i++)
{
if(set & (1<<i))
continue;

A[cur] = i;
set |= (1<<i);
print_permutation2(n, A, cur+1, set);
set &= ~(1<<i);
//int c1 = 0, c2 = 0;
//for(int j = 0; j < cur; j++) if(A[j] == P[i]) c1++;
//for(int j = 0; j < n; j++) if(P[j] == P[i]) c2++;
//if(c1 < c2)
//{
// A[cur] = P[i];
// print_permutation(n, A, cur+1);
//}
}
}
int main()
{
for(int i = 0; i < 10; i++)
P[i] = 'a' + i;
//freopen("out.txt", "w", stdout);
n = 3;
//solve();
//print_permutation(n, A, 0);
//print_permutation1();
print_permutation2(n, A, 0, 0);

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  全排列
相关文章推荐