我需要创建一个C程序来创建/生成锦标赛的计划表“每个彼此相对”。有16支球队(1到16个数字)和15轮。该表应包含圆形……
用它来填充数组:
const int NofTeams=16; int a[NofTeams][NofTeams]; int i,j; for(i = 0; i< NofTeams-1; i++) { for(j =0; j < NofTeams-1; j++) { if(i==j) { /* edge cases */ a[i][NofTeams-1]=((i+j)+(i+j)/NofTeams)%NofTeams; a[NofTeams-1][j]=((i+j)+(i+j)/NofTeams)%NofTeams; a[i][j]=0; } else { a[i][j]=((i+j)+(i+j)/NofTeams)%NofTeams; } } } /* corner cases; [0][0] is diagonal */ a[0][NofTeams-1]=NofTeams-1; a[NofTeams-1][NofTeams-1]=0; a[NofTeams-1][0]=NofTeams-1;
诀窍是序列 ((i+j)+(i+j)/NofTeams)%NofTeams 。
((i+j)+(i+j)/NofTeams)%NofTeams
这是因为永远不会打印太高的圆数(最大值是团队数减去1): %NofTeams 。
%NofTeams
这是为了跳过团队的数量(之后 % 最终成为一个不需要的人 0 ): +(i+j)/NofTeams 。
%
0
+(i+j)/NofTeams
这与其他人一起用于基本循环: (i+j) (两个中的第一个)。
(i+j)
否则,技巧是仅用循环填充非边缘情况并且特别地执行边缘情况,即基本制表概念。
输出(简单的2D表格打印,根据您所需的输出具有第一行和第一列):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 1 0 3 4 5 6 7 8 9 10 11 12 13 14 15 2 3 2 3 0 5 6 7 8 9 10 11 12 13 14 15 1 4 4 3 4 5 0 7 8 9 10 11 12 13 14 15 1 2 6 5 4 5 6 7 0 9 10 11 12 13 14 15 1 2 3 8 6 5 6 7 8 9 0 11 12 13 14 15 1 2 3 4 10 7 6 7 8 9 10 11 0 13 14 15 1 2 3 4 5 12 8 7 8 9 10 11 12 13 0 15 1 2 3 4 5 6 14 9 8 9 10 11 12 13 14 15 0 2 3 4 5 6 7 1 10 9 10 11 12 13 14 15 1 2 0 4 5 6 7 8 3 11 10 11 12 13 14 15 1 2 3 4 0 6 7 8 9 5 12 11 12 13 14 15 1 2 3 4 5 6 0 8 9 10 7 13 12 13 14 15 1 2 3 4 5 6 7 8 0 10 11 9 14 13 14 15 1 2 3 4 5 6 7 8 9 10 0 12 11 15 14 15 1 2 3 4 5 6 7 8 9 10 11 12 0 13 16 15 2 4 6 8 10 12 14 1 3 5 7 9 11 13 0