实现过程和代码如图:
假设球员总数为7人进行循环赛,采用补0固定位置并依次向逆时针方向移动位置,轮完所有位置后形成了7组数据,也就是上图用虚线隔开的7组数据。每组数据的第一排都有0,有0的那排不用看,从上往下看,第一组是27-36-45,第二组是16-25-34,第三组…这就是7人进行循环赛的排法。
如何用代码实现这个算法呢?
思路:我们可以看一下上图那7组数据下面有一行长长的数字,这串数字是由两个1至7的数列拼在一起组合而成。这串数字下方有很多条连线,仔细看每一条连线(每一条都横跨7个数字,先是1到7,然后2到1,3到2,4到3…),把每一条横跨的7个数字去掉首位数字,剩下的6位数字首尾两两组合就可以得到循环赛的排法。按照这个思路就可以用代码一步步实现了(拼接数组,循环数组,重新生成新数组,循环新数组,用加法和减法生成最终排法)。
其实奇数情况下是采取顺时针轮转的,不过原理都差不多,感兴趣的朋友可以试着用这种思路去实现。
最后附上代码实现的效果(微信小程序搜索:羽毛球编排),体验方法如图箭头:
odd(playerNum) {
var n = playerNum
var combinations = [], combination1 = [], combination2 = []
var kind = [], allkind = []
for (let i = 1; i < n + 1; i++) {
combination1.push(i)
}
combinations = combination1.concat(combination1)
for (let j = 0; j < n; j++) {//打n轮
for (let t = 0; t < n - 1; t++) {
kind.push(combinations[t + j])
}
}
for (let i = 0; i < kind.length; i += (n - 1)) {//对数组进行分组,n个元素1组
allkind.push(kind.slice(i, i + (n - 1)))
}
var round = [], m = Math.floor(n / 2)
allkind.map((item, index) => {
for (let k = 0; k < m; k++) {
round.push([item[k], item[n - k - 2]])
}
})
return round
},