要約:
ジョセフの問題は有名な問題である:Nの個人サークル、最初のレポートから始まるの数は、Mの最初に殺される、最後の残り、残りは殺されます。例えば、N = 6、M = 5、殺される順序である:5,4,6,2,3,1。
分析:
(1)死者と生きているだけで二つの状態から一人一人のために、それぞれがそれは偽のライブに示し、死んだ真表すことができ、ブール状態配列で標識することができます。
(2)各人物の開始時に生きているので、全て偽に割り当てられた配列の初期値。
(3)すべての人がこれまでに殺害されるまでのプロセスを殺すシミュレートしました。
リスト形式による1ループ
nは個体数を表し、m個のMは、人々の数を表します。
公共 INT josephRing1(INT N-、INT M){ LinkedListの <整数> =リスト新しい新しい LinkedListのは、<> (); のため(int型 I = 0、I <N - 、I ++は){ List.add(I); } int型 BT = 0 ; 一方、(。はlist.size()> 1 ){ //// ヒトM-1(0から始まる)として削除 // 分析見る前 BT =(MのBT + - 1)%のはlist.size(); リスト.remove(BT); } 戻りはlist.size()== List.get 1(0)-1。?。 }
2. 使用漸化式
nは個体数を表し、m個のMは、人々の数を表します。
公共 int型 josephRing2(int型のn、int型メートル){ IF(M <N-|| 1 <1。。 ) リターン -1 ; int型最終= 0 ; // 私はいくつかの人々は現在ありません表し ために(int型 I = 2; I <= N-; I ++の) 最終 =(M +最終)%Iは、 戻り最後の; }
3.再帰呼び出しを使用します
公共 INT josephRing3(int型のn、int型M){ 場合(N == 1)リターンN。 リターン(josephRing3(N - 1、M)+ M)%N + 1 。 }
4.最も単純な実装では、コードの行を達成するために
公共 INT josephRing(int型のn、int型M){ 戻り N == 1?N:(josephRing(N - 1、M)+ M)%N + 1 。 }