循环赛日程表问题
输入正整数k表示有n=2^k个运动员进行循环比赛,需要设计比赛日程表。每个选手与其他n-1个选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n-1天。
按此要求设计一张比赛日程表,该表有n行和n-1列,第i行第j列表示第i个选手第j天遇到的选手。
分析:
本题的方法有很多,递归是其中一种比较容易理解的方法。 如下图所示是k=3时的一个可行解(第1列是选手编号),它是4块拼起来的。 左上角是k=2时的一组解,左下角是左上角每个数加4得到,而右上角、 右下角分别由左下角、 左上角复制得到。
递归,每一次分为4个区域来处理。当然,也可以根据上面分析的规律直接模拟填充数组即可。循环k-1次,每一次填充除了左上角之外的另外3个区域。
代码参考:
http://www.cnblogs.com/crx234/p/5988418.html
http://blog.csdn.net/liufeng_king/article/details/8488421
递归的划分过程可以参考残缺棋盘的划分过程。
下面是循环填充的代码
1 #include <stdio.h> 2 #define MAX 101 3 //问题表示 4 int k; //求解结果表示 5 int a[MAX][MAX]; //存放比赛日程表(行列下标为0的元素不用) 6 void Plan(int k) 7 { int i,j,n,t,temp; 8 n=2; //n从2^1=2开始 9 a[1][1]=1; a[1][2]=2; //求解2个选手比赛日程,得到左上角元素 10 a[2][1]=2; a[2][2]=1; 11 for (t=1;t<k;t++) //迭代处理2^2(t=1)…,2^k(t=k-1)个选手 12 { 13 temp=n; //temp=2^t 14 n=n*2; //n=2^(t+1) 15 for(i=temp+1;i<=n;i++ ) //填左下角元素 16 for(j=1;j<=temp;j++) 17 a[i][j]=a[i-temp][j]+temp; 18 for(i=1;i<=temp;i++)//填右上角元素 19 for(j=temp+1;j<=n;j++) 20 a[i][j]=a[i+temp][(j+temp)%n]; 21 for(i=temp+1;i<=n;i++)//填右下角元素 22 for(j=temp+1;j<=n; j++) 23 a[i][j]=a[i-temp][j-temp]; 24 } 25 } 26 int main() 27 { 28 Plan(3); 29 for(int i=1;i<=3;i++) 30 { 31 for(int j=1;j<=3;j++) 32 printf("%d ",a[i][j]); 33 printf("\n"); 34 } 35 return 0; 36 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2014-05-25 asp.net中Cookie的用法【转】
2014-05-25 【转】ASP.NET Cookies简单应用 记住用户名和密码
2014-05-25 ASP.NET Cookie 概述【转】
2014-05-25 【转】asp.net中的cookie使用介绍