#include<iostream>
#include<algorithm>
#define MAX 51
#define MYSWAP (a,b) {int t = a ; a = b ; b = t;}
int N;
int R;
using namespace std;
char src[MAX] = { 0, 'a', 'b', 'c' };
char temp[MAX];
void print() {
printf("[");
for (int i = 0; i < R; ++i) {
printf("%c ", temp[i]);
}puts("]");
}
#if 0
inline void MY_SWAP(char* a, char* b) {
int t = *a;
*a = *b;
*b = t;
}
inline void MY_SWAP2(char& a, char& b) {
int t = a;
a = b;
b = t;
}
void perm1(int n, int r) {
if (r == 0) {
return;
}
for (int i = n - 1; i >= 0; --i) {
int t = src[n - 1];
src[n - 1] = src[i];
src[i] = t;
temp[r-1] = src[n - 1];
perm1(n - 1, r - 1);
t = src[n - 1];
src[n - 1] = src[i];
src[i] = t;
}
}
void perm2(int n, int r) {
if (r == 0) {
return;
}
for (int i = n - 1; i >= 0; --i) {
swap(src[n - 1], src[i]);
temp[r - 1] = src[n - 1];
perm2(n - 1, r - 1);
MY_SWAP(&src[n - 1], &src[i]);
}
}
#endif
void perm3(int n, int r) {
if (r == 0) {
print();
return;
}
for (int i = n; i; --i) {
swap(src[n], src[i]);
temp[r - 1] = src[n];
perm3(n - 1, r - 1);
swap(src[n], src[i]);
}
}
void perm_not_dup(int n, int r) {
if (r == 0) {
print();
return;
}
for (int i = n; i; --i) {
swap(src[n], src[i]);
temp[r - 1] = src[n];
perm3(n, r - 1);
swap(src[n], src[i]);
}
}
void pi(int n, int r) {
if (r == 0) {
print();
return;
}
for (int i = n; i; --i) {
temp[r] = src[i];
pi(n, r - 1);
}
}
void comb(int n, int r) {
if (r == 0) {
print();
return;
}
if (n < r) {
return;
}
temp[r] = src[n];
comb(n - 1, r - 1);
comb(n - 1, r);
}
void H(int n, int r) {
if (r == 0) {
print();
return;
}
if (n < r) {
return;
}
temp[r] = src[n];
H(n, r - 1);
H(n - 1, r);
}
int comb_cal(int n, int r) {
if (r == 0 || n == r) return 1;
return comb_cal(n - 1, r - 1) + comb_cal (n - 1, r);
}
int dp[101][101];
int comb_cal_dp(int n, int r) {
if (r == 0 || n == r) {
return 1;
}
if (dp[n][r] == 0) {
dp[n][r] = comb_cal_dp(n - 1, r - 1) + comb_cal_dp(n - 1, r);
}
else return dp[n][r];
}
void Ris2(int n, int r) {
puts("중복순열: ");
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
printf("[%c %c]\n", src[i], src[j]);
}
}
puts("중복순열: ");
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i != j) {
printf("[%c %c]\n", src[i], src[j]);
}
}
}
puts("조합: ");
for (int i = 1; i < n; ++i) {
for (int j = 1+i; j <= n; ++j) {
if (i != j) {
printf("[%c %c]\n", src[i], src[j]);
}
}
}
puts("중복조합: ");
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
printf("[%c %c]\n", src[i], src[j]);
}
}
}
int main(int argc, char** argv)
{
N = 3;
R = 2;
perm3(N, R);
puts("===========");
perm_not_dup(N, R);
puts("===========");
pi(N, R);
puts("============");
for (int i = 0; i <= N; ++i) {
R = i;
comb(N, R);
}
puts("===============");
N = 100, R = 2;
cout << comb_cal(N, R) << endl;
Ris2(3, 2);
return 0;
}