一、实验目的: 理解并掌握分治算法的基本思想和设计步骤。 | ||||||||
二、实验内容 设有n个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)当n是偶数时,循环赛进行n-1天,n为奇数时,循环赛进行n天。 程序代码: #include<stdio.h> int a[50][50],i,j; int ji_shu(int n) { if(n%2==1) return 1; else return 0; } int copy_o(int n) { int m=n/2; for(i=1;i<=m;i++) for(j=1;j<=m;j++) { a[i][j+m]=a[i][j]+m; a[i+m][j]=a[i][j+m]; a[i+m][j+m]=a[i][j]; } } void copy_j (int n) { int m=n/2; for(i=1;i<=m;i++) {for( j=1;j<=m+1;j++) {if(a[i][j]>m) {a[i][j]=i+m;//(m+i)填第一组的空 a[m+i][j]=i;}//填第二组的空 m+i-m else a[m+i][j]=a[i][j]+m; }
for(j=m+2;j<=n;j++) {if(i+j-1>n) { a[i][j]=j+i-1-m;} else{a[i][j]=j+i-1;}
if(m+i<j){a[m+i][j]=n+i+1-j; } else {a[m+i][j]=m+1+i-j; }//a[m+1+i][j]=m+1+i-j+1; } } } void pan_duan(int n) { if(n/2>1&&ji_shu(n/2)) copy_j(n); else copy_o(n); } void fen_zhi (int n){ if(n==1) {a[1][1]=1;return;} if (ji_shu(n)) {fen_zhi(n+1);return;} fen_zhi(n/2); pan_duan(n); } int main() { int n=0; printf ( "请输入参赛人数:" ); scanf("%d",&n); fen_zhi(n); printf ( "得到的循坏赛日程表为:\n" ); for(i=1;i<=n;i++) for(j=1;j<=n+1;j++) { if(a[i][j]>n)a[i][j]=0;} if(ji_shu(n)) { for(i=1;i<=n;i++) {for(j=1;j<=n+1;j++) printf (" %2d ",a[i][j]); printf("\n");}} else{for(i=1;i<=n;i++) {for(j=1;j<=n;j++) printf ( " %2d " ,a[i][j]); printf("\n");}} } 程序测试及运行结果: (1)输入n/2为偶数的数 (2)输入n/2为奇数的数 (3).输入n为奇数 |