Num.4 分治算法

Num.4 分治算法

算法思路

使用分治法设计程序时,一般可按以下步骤进行:

  • 分解:将要求解的问题划分成若干规模较小的同类问题;
  • 求解:当子问题划分的足够小时,用较简单的方法解决;
  • 合并:按求解问题的要求,将子问题的解逐层合并,即可构成最终的解。

举例说明:乒乓球比赛赛程

循环日程表(8人),每天每位选手比赛一场,怎样在最短时间内完成比赛?

时间第1天第2天第3天第4天第5天第6天第7天
12345678
21436687
34127856
43218765
56781234
65872143
78563412
87654321
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAXN 64
int a[MAXN + 1][MAXN + 1] = { 0 }; //屏蔽0号元素

void gamecal(int k, int n) //处理编号k开始的n个选手的日程
{
    int i, j;
    if (n == 2)
    {
        a[k][1] = k; //参赛选手编号
        a[k][2] = k + 1; //对阵选手编号
        a[k + 1][1] = k + 1; //参赛选手编号
        a[k + 1][2] = k; //对阵选手编号
    }
    else
    {
        gamecal(k, n / 2); //分治法,第一半
        gamecal(k + n / 2, n / 2); //分治法,第二半
        for (i = k; i<k + n / 2; i++) //填充右上角
        {
            for (j = n / 2 + 1; j <= n; j++)
                a[i][j] = a[i + n / 2][j - n / 2];
        }
        for (i = k + n / 2; i < k + n; i++) //填充左下角
        {
            for (j = n / 2 + 1; j <= n; j++)
                a[i][j] = a[i - n / 2][j - n / 2];
        }
    }
}

int main()
{
    int m, i, j;
    printf("参赛人数:");
    scanf_s("%d", &m);
    j = 2;
    for (i = 2; i<8; i++)
    {
        j = j * 2;
        if (j == m)break;
    }
    if (i >= 8)
    {
        printf("参赛选手人数必须为2的整数次幂,且不超过64!\n");
        getchar();
        return 0;
    }
    gamecal(1, m);
    printf("\n编号");
    for (i = 2; i <= m; i++)
        printf("%2d天 ", i - 1);
    printf("\n");
    for (i = 1; i <= m; i++)
    {
        for (j = 1; j <= m; j++)
            printf("%4d", a[i][j]);
        printf("\n");
    }
    while (getchar() != 'q');
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值