分治法解决赛程问题(递归)
循环赛程问题
有N个运动员进行单循环赛,即每个运动员要和所有其他运动员进行一次比赛。将运动员从1到N编号。只考虑次幂的情况,即N=2^k
试用分治法为这N个运动员安排比赛日程。
(1)每个运动员要和其他N-1个运动员进行一次比赛
(2)要求每个运动员每天只进行一场比赛。
(3)且整个赛程在N -1天内结束。
#include<iostream> using namespace std; #define MAX 50 int table[MAX][MAX]; void fillTable(int x, int y, int step) { if(step==1) return; step /= 2; fillTable(x,y,step); //填写左上的表格 fillTable(x+step,y,step); //填写左下的表格 for(int i=0; i<step; i++) for(int j=0; j<step; j++){ table[x+step+i][y+step+j] = table[x+i][y+j]; //右下表格抄左上表格 table[x+i][y+step+j] = table[x+step+i][y+j]; //右上表格抄左下表格 } } int main() { int n; //人数 ls: cout<<"请输入比赛的选手数量"<<endl; cin>>n; cout<<"日期 "; for(int i=1; i<n; i++) cout<<i<<" "; cout<<endl; cout<<"选手 "; for(int i=1; i<n; i++) cout<<"-----"; cout<<endl; for(int i=1; i<=n; i++) table[i][1]=i; fillTable(1, 1, n); for(int i=1; i<=n; i++){ cout<<" "<<table[i][1]<<" |"; for(int j=2; j<=n; j++) cout<<" "<<table[i][j]<<" "; cout<<endl; } goto ls; system("pause"); return 0; }
下一篇:
C语言常用函数(内容扎实)