順列や組合せを求めるプログラム

ソースコード

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=100;
int f;
int v[MAX_N];
int N,R;

void combination(int now,int cnt,int goal){
  if(cnt==goal){
    for(int i=0;i<N;i++)if(v[i])cout<<i;
    cout<<endl;
    return;
  }
  for(int i=now;i<N;i++){
    if(!(f&(1<<i))){
      v[i]=1;
      f|=(1<<i);
      combination(i+1,cnt+1,goal);
      v[i]=0;
      f&=~(1<<i);
    }
  }
}

void permutation(int now,int cnt,int goal){
  if(cnt==goal){
    for(int i=0;i<goal;i++)cout<<v[i];
    cout<<endl;
    return;
  }
  for(int i=0;i<N;i++){
    if(!(f&(1<<i))){
      v[now]=i;
      f|=(1<<i);
      permutation(now+1,cnt+1,goal);
      v[now]=-1;
      f&=~(1<<i);
    }
  }
}
int main() {
  cin>>N>>R;
  cout<<"permutation"<<endl;
  for(int i=0;i<N;i++)v[i]=-1;
  permutation(0,0,R);
  cout<<endl;
  cout<<"combination"<<endl;
  for(int i=0;i<N;i++)v[i]=0;
  combination(0,0,R);
  cout<<endl;
  return 0;
}

実行例

4 2
permutation
01
02
03
10
12
13
20
21
23
30
31
32

combination
01
02
03
12
13
23