分治算法

 

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

<1>分解:将要求解的问题划分成若干规模较小的同类问题。

<2>求解:当子问题划分得足够小时,用较简单的方法解决。

<3>合并:按求解问题的要求,将子问题的解逐层合并,即可构成最终的解。

 

例一:比赛赛程安排。

 

#include <stdio.h>
#define MAXN 64
int a[MAXN+1][MAXN+1] = {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(void){
    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");
        getch();
        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");
    }
    getch();
    return 0;
}

 

posted @ 2016-10-13 16:41  建彬  阅读(152)  评论(0编辑  收藏  举报