您的位置:首页 > 其它

uva 729(枚举排列)

2015-08-30 22:13 435 查看
题目大意:

输入一个数T,表示有T组数据。 输入两个数n, h;表示长度为n的数组,由h个1和(n-h)个0组成;

求该数组的全排列;

<span style="font-size:12px;">#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int n, h;
int p[20], A[20];

void print_permutation(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 || p[i] != p[i-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[i] == p[j]) c2++;
if(c1 < c2){
A[cur] = p[i];
print_permutation(cur+1);
}
}
}
}

int main()
{
int T;
scanf("%d", &T);
while(T--){
memset(p, 0, sizeof(p));
scanf("%d%d", &n, &h);
for(int i = n-1; i >= n-h; --i)
p[i] = 1;
print_permutation(0);
if(T)
printf("\n");
}
}</span>


运用STL中的next_permutation()函数,直接获得下一个排列;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int n, h;
int p[20], A[20];

int main()
{
int T;
scanf("%d", &T);
while(T--){
memset(p, 0, sizeof(p));
scanf("%d%d", &n, &h);
for(int i = n-1; i >= n-h; --i)
p[i] = 1;
for(int i = 0; i < n; ++i)
printf("%d", p[i]);
printf("\n");
while(next_permutation(p, p+n)){
for(int i = 0; i < n; ++i)
printf("%d", p[i]);
printf("\n");
}
if(T)
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: