Помогите с алгоритмом!

visp

Новичок
Помогите с алгоритмом!

Ребята, нужна помощь
Мне нужно создать футбольный календарь.
Дано N команд (их id в переменных или массиве - не важно).
Нужно составить футбольный календарь: каждая команда играет с каждой 2 раза (1 дома, 1 в гостях)
Вот и всё собственно... У меня никак не получается, перепробывал всякие комбинации...
Подскажите какую-нить методику или выложите сюда какой-нить код...
Спасибо!!!
ПС. Мне очень срочно и очень важно это!!!
 

Nicholas

Новичок
Юзайте наздоровье =)

PHP:
$team = array();//Список команд

//Дома
for($i = 0; $i < count($team); ++$i) {
  for($j = 0; $j < count($team); ++$j) {
    if ($team[$i] == $team[$j]) {
      // Играем сами с собой
    } else {
      // Играем с противником
    }
  }
}

//В гостях
for($i = 0; $i < count($team); ++$i) {
  for($j = 0; $j < count($team); ++$j) {
    if ($team[$i] == $team[$j]) {
      // Играем сами с собой
    } else {
      // Играем с противником
    }
  }
}
 

Wicked

Новичок
Nicholas
ты написал 2 одинаковых цикла.
и каждый из них для любой пары команд t1 и t2 уже дает 2 симметричные игры - (t1, t2) и (t2, t1) - которые можно расценивать как игры дома у t1 и у t2 соотв-но.
 

Bakti9rov

!*|=?
:-D
PHP:
<pre><?php

$teams = array(1, 2, 3, 4, 5, 6);

$table = array();

for ($i = 0; $i < count($teams) - 1; $i++)
{
  for ($j = $i + 1; $j < count($teams); $j++)
  {
    $table[] = array($teams[$i], $teams[$j]); // дома
    $table[] = array($teams[$j], $teams[$i]); // в гостях
  }
}

print_r($table);
 

visp

Новичок
Nicholas? пасибо - но оно совсем не то... я так пробовал, никак не получается! )
Bakti9rov - супер!!!!! Всё как нужно, только терь нужно ещё разобраться! ))
-------------------
И тогда ещё вопросик: нужно чтобы в определённое время постоянно загружалась страница (каждый час)...
Знаю, что это нужно использовать cron, только у мя сейчас стоит денвер и никак cron настроить не могу... Может есть ещё какой-нить другой способ? Или как настроить cron для денвера?

-~{}~ 17.07.08 00:11:

Эммм, нет... всё же не то!!!
Наверное я лучше сформулирую условие:
Вобщем...
Пусть у меня есть 6 команд!
Есть дата каждого футбольного тура!
Первый тур (например):
1-2
3-4
5-6
И это всё играется в один день
Второй тур: (тоже например)
1-3
2-5
4-6
Всё играется в один день...
-------------------------
Т.е. пусть есть массив дат, массив команд... Каждая команда играет в один тур одну игру с командой, с которой доселе ещё не встречалась... (тока если в первом туре)...
Понятно условие? :)))
Bakti9rov - всё хорошо, только с датами скорей всего не получится...
Помогите ! :)))
Пасиб! )
 

visp

Новичок
Нет, неправильно...
Вот, как я понял, первый день:
Array
(
[0] => Array
(
[0] => Array
(
[0] => 1
[1] => 2
)

[1] => Array
(
[0] => 2
[1] => 3
)

[2] => Array
(
[0] => 3
[1] => 4
)

)
Тут команды 2 и 3 играют сразу два матча... Или я опять чтото не так понял?
 

LimeJelly

Новичок
visp
Почитай про квадратичные алгоритмы.

p.s. Нас этому в школе учили...
 

visp

Новичок
Ничё не получается :(((
НЕ хочу вручную заполнять все матчи, но наверное придётся...
У мя две недели отсилы времени...
Помогите плз :(
http://phpclub.ru/paste/2118 - тут почти правильный код, единственный минус - некоторые команды между собой вообще не играют...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Эта тема не соответствует категории "теория", IMHO.
Перенес в общую.
 

soines

Новичок
PHP:
<?php
$ToursDates = array( "1.7.2008", "2.7.2008", "3.7.2008", "4.7.2008", "5.7.2008", "6.7.2008", "7.7.2008", "8.7.2008", "9.7.2008", "10.7.2008", "11.7.2008", "12.7.2008", "13.7.2008", "14.7.2008" );   //Даты туров
$Teams = array( 'Команда 1', 'Команда 2', 'Команда 3', 'Команда 4', 'Команда 5', 'Команда 6', 'Команда 7', 'Команда 8' ); //Названия команд

$TeamsNumber = count( $Teams );
$Tours = ( count( $Teams ) - 1 ) * 2; //количество туров

$PlayedGamesGlobal = array( ); // Массив сыгранных игр


for($n=0;$n<$Tours;$n++) {
	$PlayedTeams = array( ); // Массив команд, сыгравших в этом туре
	$PlayedGames = array( ); // Массив игр, сыгранных в этом туре
	for($i=0;$i<$TeamsNumber;$i++)
	{
		for($j=0;$j<$TeamsNumber;$j++)
		{
			if($i!=$j) {
				if ((!in_array( $Teams[$i].$Teams[$j], $PlayedGamesGlobal )) && (!in_array( $Teams[$i], $PlayedTeams )) && (!in_array( $Teams[$j], $PlayedTeams)) ) {
					$PlayedGamesGlobal[] = $Teams[$i].$Teams[$j];
					$PlayedGames[] = array( $Teams[$i] , $Teams[$j] );
					$PlayedTeams[] = $Teams[$i];
					$PlayedTeams[] = $Teams[$j];
				}
			}
		}
	}
	echo '<fieldset><legend>Тур №'.($n+1).' ( '.$ToursDates[$n].' ) </legend>';
	$num = count( $PlayedGames );
	for($k=0;$k<$num;$k++)
	{
		echo $PlayedGames[$k][0].' - '.$PlayedGames[$k][1].'<br />';
	}
	echo '</fieldset><br />';

}
?>
Вот вроде так правильно выдает расписание

Результат будет такой:
Тур №1 ( 1.7.2008 )
Команда 1 - Команда 2
Команда 3 - Команда 4
Команда 5 - Команда 6
Команда 7 - Команда 8

Тур №2 ( 2.7.2008 )
Команда 1 - Команда 3
Команда 2 - Команда 4
Команда 5 - Команда 7
Команда 6 - Команда 8

Тур №3 ( 3.7.2008 )
Команда 1 - Команда 4
Команда 2 - Команда 3
Команда 5 - Команда 8
Команда 6 - Команда 7

Тур №4 ( 4.7.2008 )
Команда 1 - Команда 5
Команда 2 - Команда 6
Команда 3 - Команда 7
Команда 4 - Команда 8

Тур №5 ( 5.7.2008 )
Команда 1 - Команда 6
Команда 2 - Команда 5
Команда 3 - Команда 8
Команда 4 - Команда 7

Тур №6 ( 6.7.2008 )
Команда 1 - Команда 7
Команда 2 - Команда 8
Команда 3 - Команда 5
Команда 4 - Команда 6

Тур №7 ( 7.7.2008 )
Команда 1 - Команда 8
Команда 2 - Команда 7
Команда 3 - Команда 6
Команда 4 - Команда 5

Тур №8 ( 8.7.2008 )
Команда 2 - Команда 1
Команда 4 - Команда 3
Команда 6 - Команда 5
Команда 8 - Команда 7

Тур №9 ( 9.7.2008 )
Команда 3 - Команда 1
Команда 4 - Команда 2
Команда 7 - Команда 5
Команда 8 - Команда 6

Тур №10 ( 10.7.2008 )
Команда 3 - Команда 2
Команда 4 - Команда 1
Команда 7 - Команда 6
Команда 8 - Команда 5

Тур №11 ( 11.7.2008 )
Команда 5 - Команда 1
Команда 6 - Команда 2
Команда 7 - Команда 3
Команда 8 - Команда 4

Тур №12 ( 12.7.2008 )
Команда 5 - Команда 2
Команда 6 - Команда 1
Команда 7 - Команда 4
Команда 8 - Команда 3

Тур №13 ( 13.7.2008 )
Команда 5 - Команда 3
Команда 6 - Команда 4
Команда 7 - Команда 1
Команда 8 - Команда 2

Тур №14 ( 14.7.2008 )
Команда 5 - Команда 4
Команда 6 - Команда 3
Команда 7 - Команда 2
Команда 8 - Команда 1
 

visp

Новичок
Блин...
Тут такая трабла!
Я посмотрел, что этот скрипт (последний) хорошо работает для 8 команд, ну думал что всё отлично!!!
А теперь попробовал - и оказывается если ставить больше команд - то ничего не работает :(((((
Оно для некоторых туров ставит всё правильно, а для некоторых туров выводит на 1-2 игры меньше :(

Помогите плиз, у меня уже вообще горит :(
 

soines

Новичок
visp, напиши при скольких командах ты тестил, и какой результат должен получиться.
 

visp

Новичок
Ну вот...
Я ставил в настройках 10 команд и вот что получилось:

Создание календаря
Тур №1 ( -- "-00" )
1 - 2
3 - 4
5 - 6
7 - 8
9 - 10

Тур №2 ( -- "-00" )
1 - 3
2 - 4
5 - 7
6 - 8
10 - 9

Тур №3 ( -- "-00" )
1 - 4
2 - 3
5 - 8
6 - 7

Тур №4 ( -- "-00" )
1 - 5
2 - 6
3 - 7
4 - 8

Тур №5 ( -- "-00" )
1 - 6
2 - 5
3 - 8
4 - 7

Тур №6 ( -- "-00" )
1 - 7
2 - 8
3 - 5
4 - 6

Тур №7 ( -- "-00" )
1 - 8
2 - 7
3 - 6
4 - 5

Тур №8 ( -- "-00" )
1 - 9
2 - 10
4 - 3
6 - 5
8 - 7

Тур №9 ( -- "-00" )
1 - 10
2 - 9
5 - 3
6 - 4

Тур №10 ( -- "-00" )
2 - 1
3 - 9
4 - 10
7 - 5
8 - 6

Тур №11 ( -- "-00" )
3 - 1
4 - 2
5 - 9
6 - 10

Тур №12 ( -- "-00" )
3 - 2
4 - 1
5 - 10
6 - 9

Тур №13 ( -- "-00" )
3 - 10
4 - 9
5 - 1
6 - 2

Тур №14 ( -- "-00" )
5 - 2
6 - 1
7 - 3
8 - 4

Тур №15 ( -- "-00" )
5 - 4
6 - 3
7 - 1
8 - 2

Тур №16 ( -- "-00" ) 7 - 2
8 - 1
9 - 3
10 - 4

Тур №17 ( -- "-00" )
7 - 4
8 - 3
9 - 1
10 - 2

Тур №18 ( -- "-00" )
7 - 6
8 - 5
9 - 2
10 - 1


Т.е. сначала всё идёт нормально, по 5 матчей в каждом туре, но потом внезапно становится по 4 матча....
 

soines

Новичок
visp, ну вообще то это нормально.
например в 3 туре не играют команды 9 и 10 потому что они уже сыграли оба матча между собой.
 

visp

Новичок
Нееет... Не то...
Они полюбому должны играть...
В каждом туре в данном случае должно быть 5 матчей...
Т.е. если команды 9 и 10 сыграли между собой, то в 3 туре они должны играть с командами, с которыми ещё не играли...
 
Сверху