递归与分治策略-2.11循环赛日程表
来源:互联网 发布:淘宝实名认证手机 编辑:程序博客网 时间:2024/05/21 18:43
设有n=2^k个运动员要进行网球循环赛,现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。
按此要求在表中第i行和第j列处填入第i个选手在第j天所遇到的选手。
按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。
算法如下:
public class test2_11 { /** * 算法table将循环赛日程表赋值到数组a中 * @param k 有n = 2^k个运动员 * @param a 存放循环赛日程表,且赋值从下标1开始,下标0是空值。 */ public static void table(int k,int[][] a){ int n=1; for(int i=1;i<=k;i++) n *= 2; for(int i=1;i<=n;i++) a[i][1] = i; int m = 1; //控制数组的下标,也预示分治到某一模块时该模块的间距 for(int s=1;s<=k;s++){ n /= 2; //若原n=8,则第一次划分n/2=4组,第二次2组,第三次1组。 for(int t=1;t<=n;t++) //t表示每次划分的组数,依次递减 for(int i=m+1;i<=2*m;i++) //i∈[m+1,2*m] for(int j=m+1;j<=2*m;j++){ //j∈[m+1,2*m] //第一次誊抄对角线单位元素是一个,第二次是4个,第三次是8个,以此类推 //故第一次m=1时i,j∈[2,2],第二次m=2时i,j∈[3,4],第三次m=4时i,j∈[5,8] a[i+(t-1)*2*m][j] = a[i+(t-1)*2*m-m][j-m]; //根据划分组数不同,组与组间距为(t-1)*2*m个元素 a[i+(t-1)*2*m-m][j] = a[i+(t-1)*2*m][j-m]; } m *= 2; } } public static void main(String[] args) { int n = 8; //设有8个运动员 int k = 3; int[][] a = new int[n+1][n+1]; //0行和0列为空,从下标1开始赋值 table(k,a); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) System.out.print(a[i][j]+" "); System.out.println(); } }}
运行结果如下:
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
循环赛日程表打印出来了,可是计算机是按照怎样的次序打印的呢?如下图,第一列都是0因为誊抄是从第二列开始,次序从小到大表示先后打印次序。
0 2 10 12 26 28 30 32 0 1 14 16 34 36 38 40 0 4 9 11 42 44 46 48 0 3 13 15 50 52 54 56 0 6 18 20 25 27 29 31 0 5 22 24 33 35 37 39 0 8 17 19 41 43 45 47 0 7 21 23 49 51 53 55
补充:此算法是以固定列按行划分组,如果想固定行按列划分组,只需将第10行改为a[1][i]=i;
以及第19行和21行算法改为:
a[i][j+(t-1)*2*m] = a[i-m][j+(t-1)*2*m-m]; a[i][j+(t-1)*2*m-m] = a[i-m][j+(t-1)*2*m];
阅读全文
1 0
- 递归与分治策略-2.11循环赛日程表
- 递归与分治:循环赛日程表
- 分治与递归——循环赛日程表
- 分治策略:循环赛日程表问题
- 分治:循环赛日程表(递归+非递归)
- 【算法-分治策略应用】循环赛日程表问题
- 分治算法--循环赛日程表
- 循环赛日程表-分治法
- 循环赛日程表(分治)
- 分治法,循环赛日程表
- 循环赛日程表《分治法》
- 循环赛日程表--分治法
- 循环赛日程表 分治法
- 循环赛日程表(分治)
- 分治中循环赛日程表
- 循环赛日程表(分治)
- 分治---循环赛日程表
- 分治法:循环赛日程表问题
- unity Android 交互
- caffe学习
- 算法11 抓住波粒二象性的火星人
- JEESZ-Redis分布式缓存安装和使用
- JavaWeb+Ueditor上传图片到项目外资源文件
- 递归与分治策略-2.11循环赛日程表
- gdb的多线程调试
- 浅谈JVM--《深入理解Java虚拟机》小小总结
- 代码阅读:R-FCN
- DataOutputStream 类 和DatainputStream类 的主要方法简单介绍,及代码演示(转)
- 681
- c++之static
- Vue.js实现可编辑的表格
- 解读今年的 Google IO 2017