分治算法
使用分治算法设计程序时,一般可以按照以下步骤进行:
<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; }