ラウンドロビンスケジュール(分割統治)

トピック:

  テニスラウンドロビンからn = 2 ^ k個の選手を持っています。ここで、次の各要件を満たすためにゲームのスケジュールを設計します:

  1、各プレイヤーは、n-1と各ゲームの他のプレイヤーを時間を計る必要があります。

  2、各プレイヤーのレース当日に一度だけ。

  3、n-1個のラウンドロビン日間の合計。

このゲームによれば、n個の* n次元テーブルを設計することができる、順番に各列に次のプレイヤーの最初の列は毎日ゲームプレイヤを示すスケジュールを必要とします。一例として、8人の選手下:

アイデア:

  方法パーティションによると、すべてのプレイヤーが2で分割することができ、n個のマッチメーキング・プレーヤーは、N / 2選手スケジュールによって決定することができます。これは、再帰的に分割プレーヤーのための2つの戦略に分け、スケジュールは明らかに直接配置することができ、2つだけの選手を知っています。

次の図は、8人の選手の試合スケジュールを示しています。

   

       図1

 

アルゴリズムのステップ:

  図1に示すように、ループ初期化スケジュールのプレイヤー1、図つまり最初の行を使用して。

  2、スケジュールに従ってプレイヤ1、プレイヤ2を配置します。グループとして最も小さい、すなわち、毎2~4に隣接する最小単位は、図中に、ゲームプレイヤ2は、対応するプレイヤー2が、ゲームプレーヤーを維持プレーヤーを維持する日、例えば、である。1 1行目と2行番号、第2の行数コピーの最初の列の最初の行の第2列の第2列の最初の列をコピーします。順次、列3及び4、列5、6、7及び8が記載されています。

  図3は、左上右下に応じてスケジュールに従ってプレーヤ1は、スケジュール3、4を配置データトップを右左下選手のコピー、データをコピーすることができます。

  4.最後に、最初の4人のプレーヤーによると、全員のスケジュールが両方を配置することができます。

Javaは完全なコードを実現し、次のとおりです。

1  パッケージコンテスト;
 2  
。3  インポートjava.util.Scanner;
 4  
5。 パブリック クラスコム{
 6。     プライベート 静的スキャナスキャナ;
 7  
。8      パブリック 静的 ボイドメイン(文字列[]引数){
 9。         int型のK; // ノート、Nプレーヤであります数、k個のサブ問題のスケール分割数、すなわち、2 ^ K = N-の唯一の問題であるために
 10          のSystem.out.println( "入力K:" );
 11。          スキャナー= 新しい新しいスキャナ(System.in);
 12である          K = スキャナ。 nextInt();
 13は、         INT A [] [] = 新しい新 INT [POW(2、K)+1] [POW(2、K)+1 ]。
14          テーブル(K、A)。
15          のためにint型 ; iがPOW(2、K)+1を<I ++は、I = 1 ){
 16              のためにINT J = 1; J <POW(2、k)は、J ++ ){
 17                  System.out.print(A [I] [J] +」 " )。
18              }
 19              のSystem.out.println([I] [POW(2 、k)を])。
20          }
 21      }
 22      
23      静的 ボイドテーブル(INTの K、値int [] [] a)は{
 24          INT N = POW(2、K);
 25          INT I = 1; I <= N - 、[1]私は++)Aの[I] = I;
 26は、         INT 1、M =。; // Mは、各々がIから充填記録として定義されている場合、Jは充填開始位置
 27の         ためにINT。; S <= K S ++ S = 1 {//)パーティションサイズ
 28              N- / = 2 ;
 29              のためにINT T = 1; T <= N; T ++ )// T当たり対称的なユニットの数であるパーティション
 30                  のためにINT I = M + 1である。私は<= 2 * M; I ++ )// 制御線
 31である                     ためINT J = M + 1、。J <= 2 * M; J ++ ){// コントロールバー
 32                         [I]、[J + M * 2 *(1-T)] = [IM] [J + * 2-×m個(1-T)M]; // 値は、左上隅の右下隅に等しい 
 33です                          [ I]、[J + * M×m個-2] IM [] [J + = * 2 * M(1-Tは。)(1-T)]; // 右上隅の左下隅の値に等しい値 
 34である             }
 35              M * = 2 ;
 36          }
 37      }
 38は、     
39      静的 INT POW(INT A、INT N-){// 電力機能
 40          INT RES = 1 ;
 41である         ためint型 I = 0; Iは、N <; Iは++ 42である              * = RES A。
 43          リターン解像度;
44      }
 45 }

 

おすすめ

転載: www.cnblogs.com/LieYanAnYing/p/11628008.html