n 支隊伍比賽,分別編號為0,1,2。。。。n-1,已知它們之間的實力對比關係, 儲存在一個二維數組w[n][n]中,w[i][j] 的值代表編號為i,j 的隊伍中更強的一支。 所以w[i][j]=i 或者j,現在給出它們的出場順序,並儲存在數組order[n]中, 比如order[n] = {4,3,5,8,1......},那麼第一輪比賽就是4 對3, 5 對8。....... 勝者晉級,敗者淘汰,同一輪淘汰的所有隊伍排名不再細分,即可以隨便排, 下一輪由上一輪的勝者按照順序,再依次兩兩比,比如可能是4 對5,直至出現第一名 編程實現,給出二維數組w,一維數組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 ?>