各个击破的分治算法(四)

Posted on 2018-10-25 16:51  时光top  阅读(266)  评论(0编辑  收藏  举报

一、分治算法的思想

  将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,只要解决子问题,就可得到原问题的解。

二、分治算法的解题过程

  (1)分解,将要解决的问题划分成若干个规模较小的同类问题。

  (2)求解,当子问题划分到足够小时,用简单的方法解决。

  (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

三、实例演练

  欧洲冠军杯比赛日程安排

   代码实现:

#include "stdio.h"
#include "iostream"
#define MAX 64 
int a[MAX + 1][MAX + 1] = { 0 };
void gamecal(int k, int n);//声明处理编号k开始的n个球队的日程
int main()
{
    int m, i, j;
    printf("参赛球队数:");
    scanf("%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 = 2; i <= m;i++)
    {
        for (j = 1; j <= m;j++)
        {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

void gamecal(int k, int 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];
            }
        }
    }
}

 

   实现结果:

四、总结

  枚举、回溯、分治算法利用了计算机工作的第一个特点:高速,不怕数据量大。分治算法思想利用了计算机工作的第二个特点:重复。

 

Copyright © 2024 时光top
Powered by .NET 9.0 on Kubernetes