网球循环赛日程表
2015-11-15 21:35
323 查看
#include "iostream" #include "cmath" using namespace std; int arr[20][20]; int b[20]; int odd(int n) //如果是奇数,返回1,否则返回0 { return n&1; } //如果n/2为偶数 void copy(int n) { int m = n/2; for(int i=1; i<=m; i++) { for(int j=1; j<=m; j++) { arr[i][j+m] = arr[i][j] + m; //将左上角+m填到右上角 arr[i+m][j] = arr[i][j+m]; //将右上角填到左下角 arr[i+m][j+m] = arr[i][j]; //将左上角填到右下角 } } } //如果n/2为奇数 void copyOdd(int n) { int m = n/2; for(int i=1; i<=m; i++) b[i] = b[i+m] = i+m; for(i=1; i<=m; i++) { for(int j=1; j<=m+1; j++) { if(arr[i][j]>m) { arr[i][j] = b[i]; //在前n/2轮比赛中轮空的选手与下一个未参赛的选手进行比赛 arr[i+m][j] = (b[i]+m)%n; } else arr[i+m][j] = arr[i][j] + m; //左下角 } for(j=2; j<=m; j++) { arr[i][j+m] = b[i+j-1]; //右上角 arr[b[i+j-1]][m+j] = i; //右下角 } } } //复制 void mackCopy(int n) { if(odd(n) && n/2>1) copyOdd(n); else copy(n); } //n为参赛人数 void tourna(int n) { if(n==1) { arr[1][1] = 1; return; } if(odd(n)) { tourna(n+1); //如果n是奇数,增设一个虚拟对手 return; } else tourna(n/2); //分治 mackCopy(n); } int main() { int n; cout << "输入参加比赛的运动员数量:"; cin >> n; tourna(n); cout << "循环赛日程表为:\n"; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) cout << arr[i][j] << "\t"; cout << endl; } return 0; }
相关文章推荐
- 系统级IO实践学习记录
- Python小例子(判断质数)
- 如何成为优秀的驱动开发工程师
- 打开网页的操作 发短信等
- STM32中断一些概念(主要是外部中断)
- 信息安全系统设计基础第十周
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest H】【字符串哈希 构造】Hash Code Hacker 构造有相同哈希值的不同字符串
- Java多线程线程、同步代码块、同步函数、死锁
- 顺序入栈的出栈方法种数
- A*算法
- javascript 地理位置api的测试
- DTcms会员中心添加新页面-会员投稿,获得所有文章并分页
- 大道至简78
- hihocoder #1258 签到题
- SDWebImage内部实现过程
- sicily 1052. Candy Sharing Game
- ArcGIS API for javascript开发笔记(三)——解决打印输出的中文为乱码问题
- javaWeb常见异常的解决方法
- 记2015年11月14日全球编程静修日(Global Day of Coderetreat)
- Golang+Mongodb