比赛赛程安排算法--分治算法

问题在注释中已说明,直接贴代码!

/*
 * bisaisaicheng.c
 *
 *  Created on: Nov 30, 2013
 *      Author: bing
 *
 *      每个选手必须与其他所有选手进行一次比赛,且每位选手每天必须比赛一场
 *      利用分治算法来简化日程的安排,一分为二的方法
 *    例如:
 *      请输入比赛人数,必须为2的幂次:8
		编 号 	第1天	第2天	第3天	第4天	第5天	第6天	第7天
		1       2       3       4       5       6       7       8
		2       1       4       3       6       5       8       7
		3       4       1       2       7       8       5       6
		4       3       2       1       8       7       6       5
		5       6       7       8       1       2       3       4
		6       5       8       7       2       1       4       3
		7       8       5       6       3       4       1       2
		8       7       6       5       4       3       2       1
 *
 */
#include <stdio.h>

#define MAX_NUM 16
int biao[MAX_NUM+1][MAX_NUM+1];

int schedule(int begin,int num){

	int i,j,k=num;
/*检查比赛人数是否为2的幂次*/
	while(k%2==0)
		k=k/2;
	if(k!=1){
		printf("比赛人数必须是2的幂次!");
		return -1;
	}
/* 此处开始利用分治算法,递归解决问题*/
	if(num==2){
		biao[begin][1]=begin;
		biao[begin][2]=begin+1;
		biao[begin+1][1]=begin+1;
		biao[begin+1][2]=begin;
		return 0;
	}

	schedule(begin,num/2);
	schedule(begin+num/2,num/2);
	/*填充右下半部*/
	for(i=begin+num/2;i<begin+num;i++){
		for(j=num/2+1;j<=num;j++)
			biao[i][j]=biao[i-num/2][j-num/2];
	}
	/*填充右上半部*/
	for(i=begin;i<begin+num/2;i++){
		for(j=num/2+1;j<=num;j++)
			biao[i][j]=biao[i+num/2][j-num/2];
	}
	return 0;
}

其中有一点疑惑,全局变量中的MAX_NUM怎样能避免两个文件重复定义?请留言,谢谢

 
/*
 * main.c
 *
 *  Created on: Nov 30, 2013
 *      Author: bing
 */

#define MAX_NUM 16
extern int biao[MAX_NUM+1][MAX_NUM+1];

int main(){
	int num;
	printf("请输入比赛人数,必须为2的幂次:");
	scanf("%d",&num);
	int result=schedule(1,num);
	if(result<0)
		return -1;

	int i,j;
	printf("编 号 ");
	for(i=1;i<num;i++){

		printf("\t第%d天",i);
	}
	printf("\n");
	for(i=1;i<=num;i++){
		for(j=1;j<=num;j++){
			printf("%-8d",biao[i][j]);
		}
		printf("\n");
	}
	return 0;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值