循环赛制日程表

本文介绍了一个使用分治思想的算法课程作业实例,通过具体的C++代码实现了一个比赛日程表的生成。该实例详细展示了如何利用递归原理来简化问题规模并最终解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个同样是算法课的作业,利用分治的思想,这个书上还是很简单,并且有模板,

#include <iostream>

using namespace std;
const int N=1000;
int array[N][N];
 void table(int k,int array[][N])//数组下标从1开始
 {
     int i,j,s,t;
     int n=1;
     for(i=1;i<=k;i++)
         n*=2;                       //求总人数
     for(i=1;i<=n;i++)
         array[1][i]=i;                  //第一行排1-8
     int m=1;                          //用来控制每一次填表时i行j列的起始填充位置
     for(s=1;s<=k;s++)                 //s指对称赋值的总循环次数,即分成几大步进行制作日程表
     {
         n=n/2;
        for(t=1;t<=n;t++)              //t指明内部对称赋值的循环次数
             for(i=m+1;i<=2*m;i++)
                 for(j=m+1;j<=2*m;j++)
                 {
                     array[i][j+(t-1)*m*2]=array[i-m][j+(t-1)*m*2-m];       //右上角等于左上角的值
                     array[i][j+(t-1)*m*2-m]=array[i-m][j+(t-1)*m*2];       //左下角等于右上角的值
                 }
         m*=2;
    }

 }
int main()
{
    int k;
    while(cin>>k)
    {
        table(k,array);
        for(int i=1;i<=k;i++)
        {
            for(int j=1;j<=k;j++)
            cout<<array[i][j]<<" ";
            cout<<endl;
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值