26.Algorithmゴシップ:ジョセフの問題(ヨセフスの問題)
説明
有名なユダヤ人の歴史家ヨセフスは、次の物語を持っていたと言われて:39人のユダヤ人とヨセフスと彼の友人が洞窟に隠れ、ローマ占領Qiaotapateした後、39人のユダヤ人は敵にならないのではなく、死んdecided'd 41人の個人が円形に配置自殺、最初の個人的なCountinを決め、すべての3番目の数字は、すべての自殺まで、新聞で再カウント、その後、自殺を持っている人に報告しましたこれまでに死亡しました。
しかし、ヨセフスと彼の友人をフォローしたいしませんでした、ヨセフスは、彼の友人は、彼が16と31の位置にある彼の友人で手配いたし遵守するふりをしたかったのは、この死のゲームを脱出しました。
ソリューション
ジョセフ代数分析は、問題を解決するために使用することができ、問題が今、あなたと友人は残念ながら、あなたがあなたとあなたの友人を保護する方法を、このゲームに関与メートルとし、オーケー拡大していきますか!外側のリングは自殺配列である一方、下に示すように、限り、あなたは死のゲームからの友人とあなた自身を作ることができるようように、2つの円を描き、内側の2つの円が、順に配置されています。
解決するためのプログラムを使用して、限り1つのカウントでそれを処理するための環状配列として、すべての3カウントを埋めるために、配列には、データ領域を見つけていないために、そして41の数とまっすぐに、配列:インデックスリスト1から開始し、各配列は、以下のように41個の個々のパケットとカーディフピアノ3を有する約ジョセフ配置されている位置が、行くことが自殺することができます
14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12
22 33 13 29 23
彼らは自分の夫とピアノを知らないので、人々は、殺される前に最後から二番目の自殺は、16位にランクされるようにしながら、以上のことから、最後の自殺は、31日の位置にありました友人がゲームのルールに準拠していませんでした。
#include<stdio.h>
#include<stdlib.h>
#define N 41
#define M 3
int main(void) {
int man[ N] ={
0
} ;
int count = 1;
int i = 0, pos = -1;
int alive = 0;
while (count <= N) {
do {
pos = (pos + 1) % N; // 环状处理
if (man[pos] == 0) i++;
if (i == M) { // 报数为3了
i = 0;
break;
}
} while (1);
man[pos] = count;
count++;
}
printf("\n约琴夫排列:");
for (i = 0; i < N; i++)
printf("%d ", man[i]);
printf("\n\n您想要救多少人?");
scanf("%d", & alive);
printf("\nL表示这%d人要放的位置:\n", alive);
for (i = 0; i < N; i++) {
if (man[i] > alive) printf("D");
else printf("L");
if ((i + 1) % 5 == 0) printf(" ");
}
printf("\n");
return 0;
}