Сортировка массивов: создание игр для спортивного мероприятия - PullRequest
1 голос
/ 01 августа 2011

У меня есть проблема, о которой я думал, но я не могу понять, как ее решить.Я пишу программное обеспечение для моего местного спортивного клуба, в скором времени запланирован международный турнир.Я хотел бы, чтобы администрация была максимально автоматизирована.Я уже многое сделал, но теперь я изо всех сил стараюсь сделать последнее.

Скажем, у вас есть массив с 4 командами, а именно командами A, B, C и D. Что бы я сделалКак это сделать, это создать новый массив, со всеми возможными играми.Это не так сложно сделать, но трудность заключается в том, что я хотел бы иметь какую-то возможность сортировки.Как у меня сейчас, игры создаются так:

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

Мне хотелось бы получить что-то вроде этого:

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

Кто-нибудь знает, как я могу достичьэтот?любая помощь будет принята с благодарностью.

Sidenote: A - B = B - A, нам не нужно соревнование в двух направлениях (но я могу запрограммировать этот бит самостоятельно, если это необходимо).

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Это более простая проблема, чем проблема MATRIX, и в результате диагонали

$ команд [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

A B C D

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 - AC - BD - AD - BC

0 голосов
/ 02 августа 2011

Я нашел решение своей проблемы. это показано ниже :)

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...