#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num,a[10];
void print(int *p)
{
int *q;
for(q = a; q <= p; q++){ ///a和p什么关系 ? 将整数转换为字母
printf("%c",'a'+ *q - 1);
}
cout<<endl;
}
void fun(int *p,int n,int m) ///在p数组里的前n个中选m个排列
{
for(int i = 1; i < n + 1; i++){
*p = i; ///p存下i
if(m > 1)
fun(p+1,n,m-1); ///数组+1,相当于p[i++]
else
print(p);
}
}
int main()
{
int n;
while(cin>>n>>num){
memset(a,0,sizeof(a));
fun(a,n,num);
}
}
上述的代码会出现的重复的情况,现已更新,增加了vis数组,不会出现重复的子集。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num,a[10],vis[10];
void print(int *p)
{
int *q;
for(q = a; q <= p; q++){
printf("%c",'a'+ *q - 1);
}
cout<<endl;
}
void fun(int *p,int n,int m)
{
for(int i = 1; i < n + 1; i++){
if(vis[i] == 0){
vis[i] = 1;
*p = i;
if(m > 1)
fun(p+1,n,m-1);
else
print(p);
vis[i] = 0;
}
}
}
int main()
{
int n;
while(cin>>n>>num){
memset(a,0,sizeof(a));
fun(a,n,num);
}
}