• 分治算法


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

    <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;
    }
  • 相关阅读:
    typeof检测几种较为特殊的值与Boolean强制转换哪几种值为false Amy
    类型检测 Amy
    JS基本概念 Amy
    JS导入文件与CSS导入文件的不同 Amy
    JS运行环境 Amy
    主流浏览器及其渲染引擎 Amy
    JS引用类型 Amy
    同名函数的覆盖问题 Amy
    JS变量、作用域和内存问题 Amy
    HTTP协议学习(1)
  • 原文地址:https://www.cnblogs.com/zhaojianbin/p/5957027.html
Copyright © 2020-2023  润新知