分治算法 举例

使用分治算法设计程序
1.分解:将要求解得问题划分成若干规模较小同类问题;
2.求解:当子问题划分的足够小时,用简单方法解决
3.合并:将简单问题逐一合并

实例:乒乓球比赛赛程安排
在这里插入图片描述在这里插入图片描述

#include<stdio.h>
#define MAXN 64
int a[MAXN+1][MAXN+1]={0};    //除去首元素0方便表示
void func(int k,int n)  //处理编号K开始的N个选手的日程,例如:k=1,n=2,就是1号和2号两个选手
{
	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{
		func(k,n/2);     //eg:  k=1  n=4   1  2
		func(k+n/2,n/2);   //              2  1
		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(){
	int m,i,j;
	printf("输入参赛选手人数:");
	scanf("%d",&m);
	j=2;
	for(i=2;i<6;i++)
	{
		j=j*2;
		if(j==m)
		break;
	}
	if(i>=8)
	{
		printf("参赛选手人数必须为2的整数次幂,且不超过64!\n");
		return 0;
	}
	func(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");
		 } 
	    return 0;
	
}

猜你喜欢

转载自blog.csdn.net/meridian002/article/details/87442422