创建行和列中唯一的数字矩阵
如果您在阅读问题后可以想出更好的标题,请随时更改它。
因此,作为输入,我有一个整数,它是一个介于 2 和 20 之间的偶数。我们称之为 整数 。我需要做的是生成一个介于 1 和(包括)之间的大小数字矩阵,同时遵守以下规则:$teams
$teams x $teams
$teams-1
- 对角线(从左上角到右下角)的值为 -1。
- 同一数字可能不会多次出现在同一列或同一行中。
- 如果数字出现在列 N 中,则 in 可能不会出现在 N 行中。例如,如果它出现在列 #2 中,则可能不会出现在第 2 行中,依此类推。
请注意,我们只查看对角线上方的部分。它下面的部分只是它的反映(每个数字都是它的反射+ $teams - 1),对于这个问题来说无关紧要。
前2个条件相当容易实现,但第3个条件正在杀死我。我不知道如何让它发生,特别是因为这个数字可以是2到20之间的任何偶数。下面给出了为条件 1 和 2 提供正确输出的代码。有人可以帮助我解决3号条件吗?$teams
$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。