C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.74101 の関連記事表示

<< 0 >>
■74101  リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ -(2014/12/01(Mon) 00:16:41)

    分類:[Java] 

    こんにちは。

    Javaで書いてますが、処理事態の話なので、
    どんな言語でも条件ロジックは同じだと思います。

    いま、リーグ戦のマトリックスのようなX個のチームの
    総当りロジックを組みたいのですが、頭がこんがらがって
    なかなか実現できません。

    もちろん、以下はうまく行っていないのですが、
    流れとしてはチーム数が可変でも対応できればと思い、
    以下のようにしてます。


    for (int j = 0; j < list.size(); j++) {
     System.out.println((j+1)+"節");
     for (int i = 0; i < list.size()/2; i++) {
      Integer idx1 = i + j;
      if (idx1 > list.size() - 1) {
       idx1 = list.size() - 1 - idx1;
      }
      Integer idx2 = list.size() - 1 - i ;
      if (idx2 < 1) {
       idx2 = list.size() - 1 + idx2;
      }
      System.out.println(list.get(idx1).teamname + "-" + list.get(idx2).teamname);
     }
    }

    どなたか経験がありましたら、ご教示頂ければ幸いです。
親記事 /過去ログ124より / 関連記事表示
削除チェック/

■74102  Re[1]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ shu -(2014/12/01(Mon) 07:51:22)
    No74101 (ぼぼ さん) に返信
    
     i0 1 2 3 4 5
    j
    0 / O O O O O
    1 X / O O O O
    2 X X / O O O
    3 X X X / O O
    4 X X X X / O
    5 X X X X X /
    
    O:処理する分
    /:処理しない
    X:Oでの処理の逆なので処理しない
    
    この図からj毎のiの範囲を見つけるとよいです。
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74112  Re[2]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ -(2014/12/01(Mon) 14:22:45)
    No74102 (shu さん) に返信

    > この図からj毎のiの範囲を見つけるとよいです。

    ありがとうございます。

    確かに単純なマトリックスを作るのであれば、
    1チームを固定に全チームループさせ、インクリメントして
    以降の全チームをループで対戦はカバーできるのですが、

    第1節〜みたいな形でロジックを組みたいです。
    Jリーグでは「日程くん」なるものがあり、色々なルールを
    組み込めるようです(ホームは3連続はだめなど)が、
    ルールは全く無く、全チームの総当り日程を組みたいです。

    ちなみにチームは常に偶数なので、あまりが出る事はありません。
    よろしくお願いします。
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74121  Re[3]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ -(2014/12/02(Tue) 02:29:36)
    規則性はわかりませんでしたが、一応16チームで総当り
    15節うまく割り当たったと思います。

    ロジックに落とすのはかなり大変そう。。
    最悪、これをテンプレートに該当チーム分を置換させるようにします。

    1
    日本1-日本16
    日本2-日本15
    日本3-日本14
    日本4-日本13
    日本5-日本12
    日本6-日本11
    日本7-日本10
    日本8-日本9

    2
    日本1-日本15
    日本2-日本14
    日本3-日本13
    日本4-日本12
    日本5-日本11
    日本6-日本10
    日本7-日本9
    日本8-日本16

    3
    日本1-日本14
    日本2-日本13
    日本3-日本12
    日本4-日本11
    日本5-日本10
    日本6-日本9
    日本7-日本8
    日本15-日本16

    4
    日本1-日本13
    日本2-日本12
    日本3-日本11
    日本4-日本10
    日本5-日本9
    日本6-日本8
    日本7-日本16
    日本14-日本15

    5
    日本1-日本12
    日本2-日本11
    日本3-日本10
    日本4-日本9
    日本5-日本8
    日本6-日本7
    日本13-日本15
    日本14-日本16

    6
    日本1-日本11
    日本2-日本10
    日本3-日本9
    日本4-日本8
    日本5-日本7
    日本6-日本16
    日本12-日本15
    日本13-日本14

    7
    日本1-日本10
    日本2-日本9
    日本3-日本8
    日本4-日本7
    日本5-日本6
    日本11-日本15
    日本12-日本14
    日本13-日本16

    8
    日本1-日本9
    日本2-日本8
    日本3-日本7
    日本4-日本6
    日本5-日本15
    日本10-日本14
    日本11-日本13
    日本12-日本16

    9
    日本1-日本8
    日本2-日本7
    日本3-日本6
    日本4-日本5
    日本9-日本16
    日本10-日本15
    日本11-日本14
    日本12-日本13

    10
    日本1-日本7
    日本2-日本6
    日本3-日本5
    日本4-日本16
    日本8-日本15
    日本9-日本14
    日本10-日本13
    日本11-日本12

    11
    日本1-日本6
    日本2-日本5
    日本3-日本4
    日本7-日本15
    日本8-日本14
    日本9-日本13
    日本10-日本12
    日本11-日本16

    12
    日本1-日本5
    日本2-日本4
    日本3-日本15
    日本6-日本14
    日本7-日本13
    日本8-日本12
    日本9-日本11
    日本10-日本16

    13
    日本1-日本4
    日本2-日本3
    日本5-日本16
    日本6-日本15
    日本7-日本14
    日本8-日本13
    日本9-日本12
    日本10-日本11

    14
    日本1-日本3
    日本2-日本16
    日本4-日本14
    日本5-日本13
    日本6-日本12
    日本7-日本11
    日本8-日本10
    日本9-日本15

    15
    日本1-日本2
    日本3-日本16
    日本4-日本15
    日本5-日本14
    日本6-日本13
    日本7-日本12
    日本8-日本11
    日本9-日本10
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74123  Re[4]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ shu -(2014/12/02(Tue) 10:21:38)
    No74121 (ぼぼ さん) に返信
    
    > 規則性はわかりませんでしたが、一応16チームで総当り
    > 15節うまく割り当たったと思います。
    マトリックスにそのまま展開するとこんな感じですかね。
    
    
    	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16
    1		15_1	14_1	13_1	12_1	11_1	10_1	9_1	8_1	7_1	6_1	5_1	4_1	3_1	2_1	1_1
    2			13_2	12_2	11_2	10_2	9_2	8_2	7_2	6_2	5_2	4_2	3_2	2_2	1_2	14_2
    3				11_3	10_3	9_3	8_3	7_3	6_3	5_3	4_3	3_3	2_3	1_3	12_3	15_2
    4					9_4	8_4	7_4	6_4	5_4	4_4	3_4	2_4	1_4	14_3	15_3	10_4
    5						7_5	6_5	5_5	4_5	3_5	2_5	1_5	14_4	15_4	8_5	13_3
    6							5_6	4_6	3_6	2_6	1_6	14_5	15_5	12_4	13_4	6_6
    7								3_7	2_7	1_7	14_6	15_6	12_5	13_5	11_4	4_7
    8									1_8	14_7	15_7	12_6	13_6	11_5	10_5	2_8
    9										15_8	12_7	13_7	11_6	10_6	14_8	9_5
    10											13_8	11_7	10_7	8_6	9_6	12_8
    11												10_8	8_7	9_7	7_6	11_8
    12													9_8	7_7	6_7	8_8
    13														6_8	5_7	7_8
    14															4_8	5_8
    15																3_8
    16																
    
    
    以下の部分は規則性があるので残りの部分だけ情報を持つようにしてみてはどうでしょう?
    	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16
    1		15_1	14_1	13_1	12_1	11_1	10_1	9_1	8_1	7_1	6_1	5_1	4_1	3_1	2_1	1_1
    2			13_2	12_2	11_2	10_2	9_2	8_2	7_2	6_2	5_2	4_2	3_2	2_2	1_2	
    3				11_3	10_3	9_3	8_3	7_3	6_3	5_3	4_3	3_3	2_3	1_3		
    4					9_4	8_4	7_4	6_4	5_4	4_4	3_4	2_4	1_4			
    5						7_5	6_5	5_5	4_5	3_5	2_5	1_5				
    6							5_6	4_6	3_6	2_6	1_6					
    7								3_7	2_7	1_7						
    8									1_8							
    9																
    10																
    11																
    12																
    13																
    14																
    15																
    16																
    
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74126  Re[5]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ -(2014/12/02(Tue) 12:29:20)
    No74123 (shu さん) に返信
    > 以下の部分は規則性があるので残りの部分だけ情報を持つようにしてみてはどうでしょう?

    ありがとうございます!
    ここまでしていただき、非常に感謝しています!

    確かに昨日もんもんと手であれこれ試しましたが、何とかロジックに落とせるように規則性を意識して確認していましたが、
    やっぱりどうしても明記頂いた右横△部分の規則性は難しかったです。

    どうしても他の「節」に影響を受けるので、無限ループに陥りそうなロジック。
    もう少し、シンプルになりそうな、ならなさそうな・・。規則性を探りたいと思います。

    ありがとうございます!
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74128  Re[6]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ainax -(2014/12/02(Tue) 13:27:56)
    No74126 (ぼぼ さん) に返信
    
    		1節	2節	3節	4節	5節	6節	7節	8節	9節	10節	11節	12節	13節	14節	15節
    1	VS	  15	  14	  13	  12	  11	  10	    9	    8	    7	    6	    5	    4	    3	    2	  16
    2	VS	  14	  13	  12	  11	  10	    9	    8	    7	    6	    5	    4	    3	  16	    1	  15
    3	VS	  13	  12	  11	  10	    9	    8	    7	    6	    5	    4	  16	    2	    1	  15	  14
    4	VS	  12	  11	  10	    9	    8	    7	    6	    5	  16	    3	    2	    1	  15	  14	  13
    5	VS	  11	  10	    9	    8	    7	    6	  16	    4	    3	    2	    1	  15	  14	  13	  12
    6	VS	  10	    9	    8	    7	  16	    5	    4	    3	    2	    1	  15	  14	  13	  12	  11
    7	VS	    9	    8	  16	    6	    5	    4	    3	    2	    1	  15	  14	  13	  12	  11	  10
    8	VS	  16	    7	    6	    5	    4	    3	    2	    1	  15	  14	  13	  12	  11	  10	    9
    
    組み合わせってこの組み合わせでいいのかな。
    対戦の左側固定の、右側は15→1チームまで回し、もし同じチームナンバーだった場合のみ、16チーム目を入れてやる。
    
    まちがってたらごめんなさい。
    
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74129  Re[7]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ -(2014/12/02(Tue) 14:09:12)
    No74128 (ainax さん) に返信

    ありがとうございます!
    違った視点でなるほどと感じました。

    ただ、3節の6と8が重複し、14、15の試合が無いなど、軸にするチームを完全8個固定は
    難しいのではと思います。

    ただ、この考えを元にロジックを組んで例外部の条件を見直せば、近づけそうな気がしてきました。

    ありがとうございます!
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74138  Re[8]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ainax -(2014/12/02(Tue) 21:52:13)
    No74129 (ぼぼ さん) に返信
    間違っててすみませんでした。
    きちんと調べて C# ですが、組んでみました。
    
       static void Main(string[] args)
       {
           const int TEAM_COUNT = 8; // 2 の倍数以外では未検証です。
    
           int[] cell = new int[TEAM_COUNT];
           cell[0] = TEAM_COUNT;
    
           for (int round = 1; round < TEAM_COUNT; round++)
           {
               Console.WriteLine("Round {0}", round);
    
               for (int team = 1; team < TEAM_COUNT; team++)
               {
                   cell[team] = (round + team) % (TEAM_COUNT - 1);
                   if (cell[team] == 0)
                   {
                       cell[team] = TEAM_COUNT - 1;
                   }
               }
               for (int i = 0; i < TEAM_COUNT / 2; i++)
               {
                   Console.WriteLine("\tTeam{0} vs Team{1}", cell[i], cell[TEAM_COUNT - i - 1]);
               }
    
           }
    
           Console.ReadKey();
       }
    
    /*  結果
    Round 1
    	Team8 vs Team1
    	Team2 vs Team7
    	Team3 vs Team6
    	Team4 vs Team5
    Round 2
    	Team8 vs Team2
    	Team3 vs Team1
    	Team4 vs Team7
    	Team5 vs Team6
    Round 3
    	Team8 vs Team3
    	Team4 vs Team2
    	Team5 vs Team1
    	Team6 vs Team7
    Round 4
    	Team8 vs Team4
    	Team5 vs Team3
    	Team6 vs Team2
    	Team7 vs Team1
    Round 5
    	Team8 vs Team5
    	Team6 vs Team4
    	Team7 vs Team3
    	Team1 vs Team2
    Round 6
    	Team8 vs Team6
    	Team7 vs Team5
    	Team1 vs Team4
    	Team2 vs Team3
    Round 7
    	Team8 vs Team7
    	Team1 vs Team6
    	Team2 vs Team5
    	Team3 vs Team4
    */
    
    参考元は英語版 wikipedia です。
    http://en.wikipedia.org/wiki/Round-robin_tournament
    
    結果を見て貰うと分かると思いますが、最後のチームを固定し
    その他のチームを時計回りに 1 週させています。
    (英語の読解とアルゴリズムの反映があっていれば、これで問題ないはず・・・)
    
    # ソース組んでいるとき結構混乱してましたので、
    # またまた間違っていたらごめんなさい m( _ _ )m
記事No.74101 のレス /過去ログ124より / 関連記事表示
削除チェック/

■74141  Re[9]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ -(2014/12/02(Tue) 23:15:11)
    No74138 (ainax さん) に返信

    ありがとうございます!
    正に求めていたロジックです!

    そうですね。全チームを時計回りに回し、インクリメントで1周すれば全体戦の網羅と
    節を割り出せますね。

    数式が分かって初めて納得するんですが、考えた人は頭が柔軟ですね。
    また、ainaxさんもこういう仕様に当たった時、これを的確に探し出す事も凄いですね!

    本当に勉強になりました。心からありがとうございます!
    自分はまだまだだな・・。。
記事No.74101 のレス / END /過去ログ124より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -