分治:循环赛日程表(递归+非递归)

#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<stdio.h>
#include<math.h>
using namespace std;
int a[100][100];/*循环赛日程表的全局变量*/
void copy(int tox,int toy,int fromx,int fromy,int r)/*是一个copy函数,目的是把以r为长度的正方形范围从点from到点to*/
{
    for(int i=0;i<r;i++)
      for(int j=0;j<r;j++)
        a[tox+i][toy+j]=a[fromx+i][fromy+j];
}
void Table_digui(int a[][100],int r,int l,int k)/*递归算法*/
{
    if(k==1)                       /*如果就一个当然就直接返回啦*/
        return;
    Table_digui(a,r,l,k/2);        /*填充左上角*/
    Table_digui(a,r+(k/2),l,k/2);  /*填充左下角*/
    copy(r,l,r+k/2,l+k/2,k/2);     /*从左上角拷贝到右下角*/
    copy(r+k/2,l,r,l+k/2,k/2);     /*从左下角拷贝到右上角*/
}
void Table_feidigui(int k) /*非递归算法*/
{
    int n=pow(2,k);
    for(int i=0;i<n;i++) /*第一列初始化*/
      a[i][0]=i+1;
    for(int r=2;r<=n;r*=2) /*如果要填充整个表,要有k趟,每一趟的步长为2^i(i=1,2,...k)*/
      for(int i=0;i<n;i+=r){ /*针对某一趟,假设这趟步长为r,则需要复制正方形的边长为r
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值