uva10098 - Generating Fast(快速生成有序排列)
还是题意理解不清,导致wa了2次,
题意理解了就好做了,几乎是照抄课本上的代码, 没意思:!
方法一:
生成可重集的排列:
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[15];
void printf_permutation(int n, char *flag, int cur)
{
if(n==cur)
{
for(int i = 0; i < n; i++)
printf("%c",flag[i]);
printf("\n");
return;
}
for(int i = 0; i < n; i++)if(!i||s[i]!=s[i-1])
{
int c1 = 0, c2 = 0;
for(int j = 0; j < cur; j++)
if(flag[j]==s[i])c1++;
for(int j = 0; j < n; j++)
if(s[j]==s[i])c2++;
if(c1<c2)
{
flag[cur] = s[i];
printf_permutation(n, flag, cur+1);
}
}
}
int main ()
{
int t;
char flag[15];
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
memset(flag, 0, sizeof(flag));
int len = strlen(s);
sort(s,s+len);
printf_permutation(len, flag, 0);
puts("");
}
return 0;
}方法二:
利用STL中的库函数-next_permutation()
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main ()
{
int n;
char p[15];
scanf("%d",&n);
while(n--)
{
scanf("%s",p);
int len = strlen(p);
sort(p,p+len);
do
{
printf("%s\n",p);
}
while(next_permutation(p,p+len));
puts("");
}
return 0;
}
浙公网安备 33010602011771号