题目:
有n=2^k个远动员选手,设计比赛日程表实现: (1)每个选手必须与n-1个选手比赛 (2)每个选手一天只比赛一场 (3)比赛共进行n-1天
题意:略。
思路:
把n个选手分成两组,每组内进行比赛安排,每组内的安排又要继续分成两组,直到组内仅有两人,那么就是安排这两个人进行比赛,这也就是最小子问题。用递归直到最底层设初值,逐层赋值,二维数组打出表来。
代码:
#include <bits/stdc++.h> using namespace std; const int maxn=2000; int a[maxn][maxn],n; void Table(int m) { if(m>1) { Table(m/2); for(int i=1; i<=m; i++) for(int j=1; j<=m; j++) { a[m+i][j]=a[i][j]+m; a[i][m+j]=a[i][j]+m; a[m+i][m+j]=a[i][j]; } } else { a[1][1]=1; a[1][2]=2; a[2][1]=2; a[2][2]=1; } } int main() { int k; while(~scanf("%d",&k)) { n=1; for(int i=1; i<=k; i++) n=n<<1; Table(n); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) printf("%d ",a[i][j]); printf("\n"); } } return 0; }结果:
input
3
output
1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1