zoukankan      html  css  js  c++  java
  • 分治算法

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

    <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;
    }
  • 相关阅读:
    xunjian.sh
    192.168.50.235配置
    自动备份并删除旧日志
    bg和fg命令
    linux之sed用法
    正则表示第二行,第二列
    linux下redis安装
    Hma梳理
    linux 系统监控、诊断工具之 lsof 用法简介
    java的基本数据类型有八种
  • 原文地址:https://www.cnblogs.com/zhaojianbin/p/5957027.html
Copyright © 2011-2022 走看看