質問を読んでもっといいタイトルが思いついたら、自由に変更してください。
したがって、入力として整数があり、これは 2 から 20 までの偶数です。この整数を と呼びましょう$teams
。私がする必要があるのは、次のルールを尊重しながら$teams x $teams
、1 から (1 を含む) までのサイズの数値の行列を生成することです。$teams-1
- 対角線 (左上から右下へ) の値は -1 です。
- 同じ列または行に同じ数字が複数回出現することはありません。
- 数値が列 N に表示される場合、行 N には表示されない場合があります。たとえば、列 #2 に表示される場合、行 #2 には表示されない可能性があります。
対角線より上の部分だけを見ていることに注意してください。その下の部分はそれを反映したものに過ぎず (各数字はその反映 + $teams - 1)、この問題には関係ありません。
最初の 2 つの条件はかなり簡単に達成できましたが、3 番目の条件は私を殺しています。特に、数値は 2 から 20 の間の任意の偶数である可能性があるため、それを実現する方法がわかりません$teams
。条件 1 と 2 の正しい出力を与えるコードを以下に示します。誰かが条件番号3で私を助けることができますか?
$teams = 6; //example value - should work for any even Int between 2 and 20
$games = array(); //2D array tracking which week teams will be playing
//do the work
for( $i=1; $i<=$teams; $i++ ) {
$games[$i] = array();
for( $j=1; $j<=$teams; $j++ ) {
$games[$i][$j] = getWeek($i, $j, $teams);
}
}
//show output
echo '<pre>';
$max=0;
foreach($games as $key => $row) {
foreach($row as $k => $col) {
printf('%4d', is_null($col) ? -2 : $col);
if($col > $max){
$max=$col;
}
}
echo "\n";
}
printf("%d teams in %d weeks, %.2f weeks per team\n", $teams, $max, $max/$teams);
echo '</pre>';
function getWeek($home, $away, $num_teams) {
if($home == $away){
return -1;
}
$week = $home+$away-2;
if($week >= $num_teams){
$week = $week-$num_teams+1;
}
if($home>$away){
$week += $num_teams-1;
}
return $week;
}
現在のコード ($teams=6 の場合) では、次の出力が得られます。
-1 1 2 3 4 5
6 -1 3 4 5 1
7 8 -1 5 1 2
8 9 10 -1 2 3
9 10 6 7 -1 4
10 6 7 8 9 -1
6 teams in 10 weeks, 1.67 weeks per team
ご覧のとおり、数値 1 は 2 列目と 2 行目の両方に表示され、数値 4 は 5 列目と 5 行目の両方に表示されます。これはルール #3 に違反しています。