【羽毛球编排自动化】一键生成循环赛编排方案(上篇)

实现过程和代码如图:

 

e1d08b94e8bb636eec2fd38d45747afa.png

 

假设球员总数为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位数字首尾两两组合就可以得到循环赛的排法。按照这个思路就可以用代码一步步实现了(拼接数组,循环数组,重新生成新数组,循环新数组,用加法和减法生成最终排法)。

其实奇数情况下是采取顺时针轮转的,不过原理都差不多,感兴趣的朋友可以试着用这种思路去实现。

最后附上代码实现的效果(微信小程序搜索:羽毛球编排),体验方法如图箭头:

 

3e1cb8079ea2470625480ebacd1de004.jpeg

 

 

 

 

  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


  },

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值