必威体育Betway必威体育官网
当前位置:首页 > IT技术

分治法之循环赛日程表的理解和解题思路

时间:2019-09-30 06:45:22来源:IT技术作者:seo实验室小编阅读:60次「手机版」
 

循环赛日程表

一、问题:

设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表

(1)每个选手必须与其他n-1个选手各赛一场

(2)每个选手一天只能赛一次

(3)循环赛一共进行n-1天

将比赛日程表设计成n行n列,表中除了第一列,其他n-1列才是我们要的,数组下标行列都从0开始,第i行j列代表第(i+1)位选手在第j天的对手:

以8个选手为例子,下面是填表的步骤:

①我们先初始化第一行各个数为1~8;

②因为是递归,那么要填8x8的左下角和右下角,分别需要知道它的右上角和左上角

③而8x8的盒子它的左上角是一个4x4的盒子,要填4x4的左下角和右下角,也分别需要知道它的右上角和左上角

④现在递归到4x4的盒子的左上角,是一个2x2的盒子,它不需要递归了,直接沿对角线填左下角和右下角的数字,也就是上面的图②

⑤可以看到,经过上面的②③步,我们左上角4x4的盒子,它的·右上角和左上角已经知道了,那就可以沿对角线填它的左下角和右下角了,所以出现了图④

⑥其他的依次类推

通俗易懂地讲,就是如果你想填一个大的,你得先得出它左上角和右上角两个盒子,再沿对角线分别抄到右下角和左下角。而为了得出它左上角和右上角,就需要递归了。

下面是我源码(如有问题,欢迎各位大牛指出哈~~):

#include <iOStream>
using namespace std;
#define N 50

//打印盒子 
        void print(int n,int game[][N]){
     
        for(int i=0;i<n;i++){
              for(int j=0;j<n;j++){
                               cout << game[i][j] << " ";
                               }
                               
                               cout << endl;
              }
     
        }


//递归函数 
  void arrange(int p,int q,int t,int arr[][N]){
           
           
           //规格为4及以上,它的左上角和右上角要递归
           if(t>=4){
                         arrange(p,q,t/2,arr);
                         arrange(p,q+t/2,t/2,arr);
                    } 
           
            //填左下角
            for(int i=p+t/2;i<p+t;i++){
                    for(int j=q;j<q+t/2;j++){
                          arr[i][j]=arr[i-t/2][j+t/2];
                          }
                    }
            //填右下角 
            for(int i=p+t/2;i<p+t;i++){
                    for(int j=q+t/2;j<q+t;j++){
                          arr[i][j]=arr[i-t/2][j-t/2];
                          }
                    }
                                  
            
      }


  //主函数
       int main(){
       int n;
       int game[N][N];
                          
       cout << "请输入选手人数:" << endl;
       cin >> n;

       //初始化第一行,其他全为0 
       for(int i=0;i<n;i++){
               for(int j=0;j<n;j++){ 
               if(i==0)         
               game[i][j]=j+1;
               else
               game[i][j]=0;
               }
             }
             
      
      //递归 
      arrange(0,0,n,game);
           
      //打印输出循环赛日程表 
      print(n,game);
        
                       
      system("pause");      
      return 0;
      }

相关阅读

C#当发布软件时提示系统必备FrameWork处理方法(FrameWo

C#当发布软件时提示系统必备FrameWork,报错如下: 处理方法: 1、将“dotNetFx40_Full_x86_x64.exe”文件拷贝到:C:\Program Files (

algorithm库介绍之---- stable_sort()方法 与 sort()

文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html关于stable_sort()和sort()的区别:你发现有sort和sta

12个常见的外链建设方法

外链是SEO中不可或缺的一部分。提升网站排名,很重要的一点,就是网站的外链建设。下面小编来说一下怎么去做外链。1、 自己的网站新

枪毙ctfmon.exe 恢复你的默认输入法

方法一:如果你的win2000系统装了officeXP或以上版本,它会在你和系统里留下一个可误的ctfmon.exe,这真的是一个恶魔,曾经困扰了无数的

FCM算法原理及MATLAB实现

机器感知 一个专注于SLAM、三维重建、机器视觉等相关技术文章分享的公众号 (一)原理部分 模糊C均值(Fuzzy C-means)算法简称FCM算

分享到:

栏目导航

推荐阅读

热门阅读