问题说明
设有n=2k个选手要进行网球循环赛, 要求设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次。
按此要求,可将比赛日程表设计成一个 n 行n-1列的二维表, 其中,第 i 行第 j 列表示和第 i 个选手在第 j 天比赛的选手。
功能说明
本程序运用分治的思想,实现了循环赛日程安排问题的求解, 生成日程表,输出。
代码简述
通过用户输入数据,程序输入检测,动态分配空间, 调用生成日程表函数,显示输出。
其中,生成日程表函数运用分治的思想,分成separate份, 先安排第一行(第一份),然后每一份填充,最终求解完毕, 生成日程表。
源码示例
#include<iostream>#include<math.h>usingnamespacestd;//循环赛日程安排函数声明voidMatchTable(intk,intn,int**table);intmain(){intn =0, k =0;//用户界面cout <<"---------------- 循环赛日程安排问题 ----------------"<< endl;cout <<"请输入k(k>=0),构成 n=(2^k) 个选手的循环赛"<< endl;//输入k值cin >> k;//判断输入数据合法性,包括检查输入是否为数字,k值是否大于0if(cin.fail() || k <0){cout <<"输入k错误!"<< endl;system("pause");return0;}//计算比赛日程表大小n =pow(2, k);//分配日程表空间int**table =newint*[n +1];for(inti =0; i <= n; i++){table[i] =newint[n +1];}//进行循环赛日程安排,生成日程表MatchTable(k, n, table);//显示输出cout <<"------------------------------------------------"<< endl;for(inti =1; i <= n; i++){for(intj =1; j <= n; j++){cout << table[i][j] <<"\t";}cout << endl;}cout <<"------------------------------------------------"<< endl;//暂停查看结果system("pause");//释放内存for(inti =0; i <= n; i++)delete[]table[i];delete[]table;//指针置空table =NULL;return0;}//进行循环赛日程安排,生成日程表voidMatchTable(intk,intn,int**table){//设置日程表第一行的值for(inti =1; i <= n; i++)table[1][i] = i;//每次填充的起始填充位置intbegin =1;//用分治法分separate份,循环求解for(intseparate =1; separate <= k; separate++){//日程表进行划分n /=2;//flag为每一小份的列的标记for(intflag =1; flag <= n; flag++){//操作行for(inti = begin +1; i <=2* begin; i++){//操作列for(intj = begin +1; j <=2* begin; j++){//把左上角的值赋给右下角table[i][j + (flag -1) * begin *2] = table[i - begin][j + (flag -1) * begin *2- begin];//把右上角的值赋给左下角table[i][j + (flag -1) * begin *2- begin] = table[i - begin][j + (flag -1) * begin *2];}}}//进入日程表的下一个划分进行填充begin *=2;}}
今天的分享就到这里了,大家要好好学C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
微信公众号:C语言编程学习基地
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!