时限:1000ms 内存限制:10000K 总时限:3000ms
描述: 用分治算法生成循环赛日程表(1到2的n次方个人)
输入: 一个整数n
输出: 循环赛日程表(1到2的n次方个人)
输入样例:
3
输出样例:
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
#include<stdio.h> #include<math.h> #define N 65 int Arr[N][N]={0}; void timetable(int np); void copy(int np); void print(int np); int main() { int n,np; scanf("%d",&n); np=pow(2,n); timetable(np); print(np); return 0; } void timetable(int np) { if(np==1) { Arr[1][1]=1; return; } else { timetable(np/2); copy(np); } } void copy(int np) { int k=np/2; for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) { Arr[i][j+k]=Arr[i][j]+k; Arr[i+k][j]=Arr[i][j]+k; Arr[i+k][j+k]=Arr[i][j]; } } void print(int np) { for(int i=1;i<=np;i++) { printf("%d",Arr[i][1]); for(int j=2;j<=np;j++) printf(" %d",Arr[i][j]); printf("\n"); } }