按升顺给一组数,按字典顺序输出全排列。这里使用所谓的“进位法”。
很难说清具体步骤,直接贴代码。
#include<stdio.h>
#include <string.h>
void solve(int k)
{
int p = 5 ;
char num[12],a[7] = {0,1,2,3,4,5 ,k};
for (int i=0; i<k; i++ )
scanf("%d",& num[i]);
while (p > 0 ) {
for (i=0; i<5; i++ )
printf("%d " ,num[a[i]]);
printf("%d/n",num[a[5 ]]);
if (a[p] < a[p + 1] - 1) a[p]++ ;
else {
p-- ;
a[p]++ ;
while (a[p + 1] - 1 > a[p] && p < 5 ) {
a[p + 1] = a[p] + 1 ;
p++ ;
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1088.txt","r" ,stdin);
#endif
int t = 0 ,k;
while(scanf("%d",&k) != EOF && k != 0 ) {
if (t++ > 0) printf("/n" );
solve(k);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0 ;
}
#include <string.h>
void solve(int k)
{
int p = 5 ;
char num[12],a[7] = {0,1,2,3,4,5 ,k};
for (int i=0; i<k; i++ )
scanf("%d",& num[i]);
while (p > 0 ) {
for (i=0; i<5; i++ )
printf("%d " ,num[a[i]]);
printf("%d/n",num[a[5 ]]);
if (a[p] < a[p + 1] - 1) a[p]++ ;
else {
p-- ;
a[p]++ ;
while (a[p + 1] - 1 > a[p] && p < 5 ) {
a[p + 1] = a[p] + 1 ;
p++ ;
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1088.txt","r" ,stdin);
#endif
int t = 0 ,k;
while(scanf("%d",&k) != EOF && k != 0 ) {
if (t++ > 0) printf("/n" );
solve(k);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0 ;
}