次のプログラムは、男性M人、女性N人の場合に、
全パターンと、できたカップルを表示するものです。
コード:
#include <stdio.h> // printf
#include <math.h> // pow
int M = 5; // 男性の人数
int N = 5; // 女性の人数
int b[10]; // b[i] は i番の男性が選択した女性の番号
int g[10]; // g[j] は j番の女性が選択した男性の番号
int k; // カップルができない個数
void show(void)
{
for (int i = 0; i < M; i++) printf(" %d", b[i]);
printf(" :");
for (int j = 0; j < N; j++) printf(" %d", g[j]);
printf(" :");
int m = 0;
for (int i = 0; i < M; i++)
if (g[b[i]] == i) printf(" %d-%d", i, b[i]), m++;
if (m == 0) k++;
printf("\n");
}
void girl(int j) // j は女性の番号
{
if (j == N) // 女性の相手が全部決まったら
show(); // 全員の選択結果を表示
else
for (g[j] = 0; g[j] < M; g[j]++)
girl(j + 1);
}
void boy(int i) // i は男性の番号
{
if (i == M) // 男性の相手が全部決まったら
girl(0); // 女性の先頭から調べる
else
for (b[i] = 0; b[i] < N; b[i]++)
boy(i + 1);
}
int main(void)
{
while (1) {
printf("enter M N>> ");
if (scanf("%d%d", &M, &N) != 2) break;
k = 0;
boy(0);
double p = pow(N, M) * pow(M, N);
printf("1 - %d / %.15g = %.15g\n", k, p, 1 - k / p);
}
}
実行結果
コード:
enter M N>> 1 1
0 : 0 : 0-0
1 - 0 / 1 = 1
enter M N>> 2 1
0 0 : 0 : 0-0
0 0 : 1 : 1-0
1 - 0 / 2 = 1
enter M N>> 2 2
0 0 : 0 0 : 0-0
0 0 : 0 1 : 0-0
0 0 : 1 0 : 1-0
0 0 : 1 1 : 1-0
0 1 : 0 0 : 0-0
0 1 : 0 1 : 0-0 1-1
0 1 : 1 0 :
0 1 : 1 1 : 1-1
1 0 : 0 0 : 0-1
1 0 : 0 1 :
1 0 : 1 0 : 0-1 1-0
1 0 : 1 1 : 1-0
1 1 : 0 0 : 0-1
1 1 : 0 1 : 1-1
1 1 : 1 0 : 0-1
1 1 : 1 1 : 1-1
1 - 2 / 16 = 0.875
enter M N>> 3 3
0 0 0 : 0 0 0 : 0-0
0 0 0 : 0 0 1 : 0-0
0 0 0 : 0 0 2 : 0-0
0 0 0 : 0 1 0 : 0-0
0 0 0 : 0 1 1 : 0-0
0 0 0 : 0 1 2 : 0-0
...
1 2 0 : 1 2 0 :
1 2 0 : 1 2 1 : 1-2
1 2 0 : 1 2 2 :
1 2 0 : 2 0 0 : 0-1 2-0
1 2 0 : 2 0 1 : 0-1 1-2 2-0
1 2 0 : 2 0 2 : 0-1 2-0
1 2 0 : 2 1 0 : 2-0
1 2 0 : 2 1 1 : 1-2 2-0
1 2 0 : 2 1 2 : 2-0
...
2 2 2 : 2 1 2 : 2-2
2 2 2 : 2 2 0 : 0-2
2 2 2 : 2 2 1 : 1-2
2 2 2 : 2 2 2 : 2-2
1 - 156 / 729 = 0.786008230452675
enter M N>>
表示のフォーマットは次の通り。
男性が選択した女性の番号 : 女性が選択した男性の番号 : できたカップル
男性1人女性1人の場合、お互いに選択肢がなく、カップルができます。
男性2人女性1人の場合もカップルができます。
男性2人女性2人の場合、すべての組み合わせ 2
4 = 16通りのうち
2組のカップルができるのが 2通り。
1組のカップルができるのが 12通り。
カップルができないのが 2通り。
男性3人女性3人の場合、すべての組み合わせ 3
6 = 729通りのうち
カップルができないのが 156通り。
男性4人女性4人の場合と男性5人女性5人の場合は時間がかかるので、
リダイレクトでファイルに出力して、表示させないようにしましょう。
男性5人女性5人の場合は表示させなくても数十秒かかるでしょう。