PHP 隊伍比賽問題

來源:互聯網
上載者:User

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 ?>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.