去评论
推扬网

李垚:算法理解题 循环赛比赛日程表

admin
2020/08/11 16:45:25

艾立卡的回答:

题目好像有问题。 当n=23=8时?? 应该是:n=2k=8吧! (1)如果n=2k 循环赛需要进行(n-1)!场比赛。 至少要进行(n-1)天,因为: ①每个选手必须与其他n-1名选手比赛各一次; ②每个选手一天至多只能赛一次; ③循环赛要在最短时间内完成。 (2)当n=2k=8时,循环赛日程表: 第1天:1-2;3-4;5-6;7-8; 第2天:1-3;2-4;5-7;6-8; 第3天:1-4;2-3;5-8;6-7; 第4天:1-5;2-6;3-7;4-8 第5天:1-6;2-7;3-8;4-5; 第6天:1-7;2-8;3-5;4-6; 第7天:1-8;2-5;3-6;4-7;

杨立学的回答:

题目好像有问题。 当n=23=8时?? 应该是:n=2k=8吧! (1)如果n=2k 循环赛需要进行(n-1)!场比赛。 至少要进行(n-1)天,因为: ①每个选手必须与其他n-1名选手比赛各一次; ②每个选手一天至多只能赛一次; ③循环赛要在最短时间内完成。 (2)当n=2k=8时,循环赛日程表: 第1天:1-2;3-4;5-6;7-8; 第2天:1-3;2-4;5-7;6-8; 第3天:1-4;2-3;5-8;6-7; 第4天:1-5;2-6;3-7;4-8 第5天:1-6;2-7;3-8;4-5; 第6天:1-7;2-8;3-5;4-6; 第7天:1-8;2-5;3-6;4-7;

King的回答:

直接上代码吧~~ #include void copy(int n); void tour(int n); void makecopy(int n); void copyodd(int n); int a[100][100]; int b[100]; int main() { int n,i,j; printf("please input n :\n"); scanf("%d",&n); for(i=1;i<=n;i++) { a[1][i]=i; a[i][1]=i; } tour(n); if(n % 2 == 1) for(i=1;i<=n;i++) { for(j=1;j<=n+1;j++) { if(a[i][j] == n +1) printf(" "); else printf("%-4d",a[i][j]); } printf("\n");; } else for(i=1;i<=n;i++) { for(j=1;j <= n;j++) { if(a[i][j] == n +1) printf(" "); else printf("%-4d",a[i][j]); } printf("\n");; } } void copy(int n) { int m = n/2; int i,j; 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 tour(int n) { if(n==1) { a[1][1]=1; return; } if(n%2==1)//奇数 { tour(n+1); return; } tour(n/2); makecopy(n); } void makecopy(int n) { if(n/2>1 && ((n/2)%2)) copyodd(n); else copy(n); } void copyodd(int n) { int i,j; int m=n/2; for(i=1;i<=m;i++) { b[i]=m+i; b[m+i]=b[i]; } for(i=1;i<=m;i++) { for(j=1;j<=m+1;j++) { if(a[i][j]>m) { a[i][j]=b[i]; a[m+i][j]=(b[i]+m)%n; } else { a[m+i][j]=a[i][j]+m; } } for(j=2;j<=m;j++) { a[i][m+j]=b[i+j-1]; a[b[i+j-1]][m+j]=i; } } } 就这个啦,希望能帮到你给分吧~~

赖长清的回答:

好像有问题,搞好给你