2011-08-01 34 views
1

我有一個問題,我一直在想,但我無法弄清楚如何解決它。我正在爲本地體育俱樂部編寫軟件,該俱樂部即將舉行國際比賽。我希望儘可能使管理機構自動化。我已經做了很多事情,但現在我正在努力完成最後一件事。假設你有4支隊伍,分別是A隊,B隊,C隊和D隊。我想要做的是創建一個新的陣列,包括所有可能的比賽。這並不難,但困難在於我希望在其中具有某種分類能力。我現在有它的方式,在遊戲中創建這樣的:陣列排序:爲體育事件創建遊戲

['A - B', 'A - C', 'A - D', 'B - C' , ...] 

我想什麼有是這樣的:

['A - B', 'C - D', 'A - C', 'B - D', 'A - D', ...] 

有誰知道我怎麼能做到這一點?任何幫助將不勝感激。我們不需要雙向競爭(但如果需要,我可以自己編程)。

+0

什麼是您的確切要求,當訂購遊戲?沒有球隊一個接一個地打兩場比賽?固定團隊的數量(4)? –

+0

沒有球隊打兩場比賽並且球隊數量不固定(可能是5,可能是6,...)這就是使得難度增加的部分:) –

+0

是否有一個要求限制最大值團隊在兩場比賽之間沒有比賽的比賽數量? –

回答

0

我找到了解決我的問題的方法。 它顯示在下面:)

function sort_array($teams) 
{ 
    $num_teams = count($teams); 
    if(count($teams)%2 != 0) 
    { 
     $ghost = array(); 
     $ghost["name"] = "ghost"; 

     array_push($teams, $ghost); 
     $num_teams++; 
    } 

    $games = array(); 
    for($i = 1; $i < $num_teams; $i++) 
    { 
     if($teams[$i]["name"] != "ghost") 
       array_push($games, $teams[0]["name"] . " - " . $teams[$i]["name"]); 

     for($k = 1; $k <= $num_teams; $k++) 
     { 
      $index_team_1 = ($i+$k < $num_teams) ? $i+$k : $i+$k-$num_teams; 
      $index_team_2 = ($i-$k > 0) ? $i-$k : $i-$k+$num_teams-1; 

      $temp_add = array(); 
      $temp_add["team_1"] = $teams[$index_team_1]["name"]; 
      $temp_add["team_2"] = $teams[$index_team_2]["name"]; 

      if($teams[$index_team_1]["name"] != "ghost" && 
       $teams[$index_team_2]["name"] != "ghost" && 
       $index_team_1 != 0 && 
       $index_team_2 != 0 && 
       $temp_add["team_1"] != $temp_add["team_2"] && 
       !in_array($temp_add["team_1"] . " - " . $temp_add["team_2"], $games) && 
       !in_array($temp_add["team_2"] . " - " . $temp_add["team_1"], $games)) 
       { 
        array_push($games, $temp_add["team_1"] . " - " . $temp_add["team_2"]); 
       } 
     } 
    } 

    return $games; 
} 
1

這是一個簡單的問題,更多的是矩陣的問題,其結果是對角線

$隊[0 ...N]

$index=0; 
for($i=0;$i<$n;$i++){ 
    for($c=$i+1;$c<$n;$c++) 
     $matches[$index++]=$teams[$i]." - ".$teams[$c]; 
} 

現在$比賽最終的比賽 矩陣排序是:

$sorted_games //You should pass on the matches diagonally and skipping one when possible 

ABCD

AB --- AC --- AD

------- BC --- BD

------------- -CD

其索引是

0 --- 1 --- 2

----- 3 --- 4

------ ---- 5個

通行證對角線和跳過可能時:

0,則5(我們跳過3)

現在去裏面1

所以0 - 5 - 1

現在我們不要跳過(因爲不是主對角線因此,我們採取4)

所以0 - 5 - 1 - 4

我們內部繼續2

所以0 - 5 - 1 - 4 - 2

最後,我們回到主對角線並獲得3

所以結果是0-5-1-4-2-3

和匹配爲:AB - CD - 交流 - BD - AD - BC

+0

現在我會試試這個,但是它看起來合乎邏輯;)謝謝你的回答 –

+0

這看起來不錯,但我該如何編程對角線的迭代? :) –

+0

我試圖找到一種方式:(但我在辦公室工作:我真的認爲它很簡單): –