PHPチームの試合問題

13750 ワード

nチームの試合は、それぞれ0、1、2...n−1は、それらの間の実力対比関係が知られており、1つの2次元配列w[n][n]に格納され、w[i][j]の値はi、jと番号付けされたチームの中でより強い1本を表す.したがってw[i][j]=iまたはjは、それらの出場順序を与え、order[n]={4,3,5,8,1......}のような配列order[n]に格納される.では、1回戦は4対3、5対8です.......勝者が昇格し、敗者が淘汰され、同じラウンドで淘汰されたすべてのチームの順位は細分化されなくなり、すなわち勝手に並ぶことができ、次のラウンドは前のラウンドの勝者が順番に、さらに2対5の順に、例えば1位のプログラミングが実現するまで、2次元配列w、1次元配列orderと試合順位を出力するための配列result[n]を与え、resultを求める.
 1 <?php

 2     #      ,        w[n][n]          order[n]

 3     #         r[n]

 4 

 5     #  

 6     function swap(&$a, $i, $j) {

 7         $temp = $a[$i];

 8         $a[$i] = $a[$j];

 9         $a[$j] = $temp;

10     }

11 

12     function result($w, $order) {

13         $result = array();

14         while (count($order) > 1) {

15             $len = count($order);

16             $next_order = array();

17             for ($i = 0; $i < $len; $i += 2) {

18                 #              

19                 if ($i == $len - 1) {

20                     $next_order[] = $order[$i];

21                     break;

22                 }

23                 

24                 #

25                 $next_order[] = $w[$order[$i]][$order[$i + 1]];

26                 $result[] = $w[$order[$i]][$order[$i + 1]] == $order[$i] ? $order[$i + 1] : $order[$i];

27             }

28 

29             #        

30             $order = $next_order;

31         }

32 

33         $result[]  = $order[0];

34         return $result;

35     }

36 

37     #     ,     O(1)

38     function result2($w, $order) {

39         $limit = count($order);

40 

41         #  n - 1   

42         while ($limit > 1) {

43             #         

44             for ($i = 0, $j = 0; $i < $limit; $i += 2) {

45                 $win_inx = ($i == $limit - 1) ? $i : ($w[$order[$i]][$order[$i + 1]] == $order[$i] ? $i : $i + 1); #       

46                 swap($order, $win_inx, $j); #         

47                 $j++;

48             }

49             $limit = $j;

50         }

51 

52         return $order;        

53     }

54 

55     #                  

56     for ($i = 0; $i < 11; $i++) {

57         $order[] = $i;

58         for ($j = 0; $j < 11; $j++) {

59             $rand = rand(2, 11) % 2;

60             $w[$i][$j] = $rand ? $i : $j;

61         }

62     }

63 

64     shuffle($order);

65 

66     $result= result($w, $order);

67     print_r($w);

68     echo "<br>";

69     echo "<br>";

70     print_r($order);

71     echo "<br>";

72     echo "<br>";

73     print_r($result);

74     echo "<br>";

75     echo "<br>";

76     print_r(result2($w, $order));

77     echo "<br>";

78     echo "<br>";

79 ?>