生成全排列的一些方法
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;
}
#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;
}
相关文章推荐
- qmake.exe是在Qt安装编译时生成的,里面内嵌了Qt相关的一些路径(最简单的方法是保持一样的安装路径,最方便的办法是设置qt.conf文件)
- Python生成8位随机字符串的一些方法 分类: python学习 2015-04-28 20:00 62人阅读 评论(0) 收藏
- 一些PHP生成唯一字符串的方法
- Python生成8位随机字符串的一些方法
- 由Pojo及*.hbm.xml生成数据库表的方法及一些问题
- DotNet生成随机数的一些方法
- 生成.X文件的一些方法&&DirectX获取及处理.X文件(初级版)
- C#下用zedGraph生成大量数据统计图表的方法(通过修改一些源码)
- spec文件中写上一些脚本,使生成的rpm包在安装前删除系统中指定文件的方法
- Delphi 中将一些 Dll等生成资源文件打包成一个独立的EXE程序方法步骤
- spec文件中写上一些脚本,使生成的rpm包在安装前删除系统中指定文件的方法
- 浅谈生成全排列的4种方法
- 全排列的生成方法
- 18.9 随机生成一些数字并传入某个插入方法。 编写一个程序,高效地插入过的元素的维护中位数。
- 程序员面试金典——解题总结: 9.18高难度题 18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
- 浅谈生成全排列的4种方法
- 对于解决一些VS 2010/2012 C++ 生成的exe在非编译环境电脑中缺失dll的方法
- DotNet生成随机数的一些方法
- ASP.NET生成XML的一些方法
- Python生成8位随机字符串的一些方法