循环赛日程表棋盘覆盖问题.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
循环赛日程表棋盘覆盖问题

《算法设计与分析》实 验 报 告( 2 ) 学号 姓名:黄佳伟 班级: 计102 成绩: 实验名称:分治算法设计验证 实验地点:信息楼215 所使用的工具软件及环境:Microsoft Visual Studio 2010 实验要求: 项目一:循环赛日程表问题 1.了解程序的执行过程,正确分析算法时间复杂性; 2.完成代码编写,调试正确 3.对n=8,n=11进行测试。 项目二:棋盘覆盖问题求解 1.了解程序的执行过程,正确分析算法时间复杂性; 2.完成代码编写,输出棋盘覆盖矩阵; 3.对4×4,8×8棋盘进行测试。 二、实验内容: 项目一:循环赛日程表问题 重要的程序说明 设你班有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次。 (2)每个选手一天只能参赛一次。 (3)循环赛在n-1天内结束 按此要求可将比赛日程表设计成有n行和n-1列的表。在表中第i行和第j列处填入第i个选手在第j天所遇到的选手。按分治策略,可以将所有选手对分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用这种一分为二的策略对选手进行分割,直到只剩下两个选手时,比赛日程表的制定就变得很简单,这时只要让这两个选手进行比赛就可以了。 #includeiostream using namespace std; const int SIZE = 50; int a[SIZE][SIZE]; void copy(int n); void tournament(int n); int odd(int n); void makecopy(int n); void copyodd(int n); void main() { int n; int i,j; cout输入运动员人数:; cin n; tournament(n); cout***********循环赛日程表***********endl; if(odd(n)) // n为奇数和偶数输出情况不同,要分别考虑 { for(i = 1; i=n; i++) { for(j = 1; j=n+1; j++) if(a[i][j] == n+1) cout 0 ; else cout a[i][j] ; cout endl; } } else { for(i = 1; i=n; i++) { for(j = 1; j=n; j++) cout a[i][j] ; cout endl; } } } void copy(int n) { int m = n/2; for(int i = 1; i=m; i++) for(int j = 1; j=m; j++) { a[i][j+m] = a[i][j] + m; a[i+m][j] = a[i][j+m]; a[i+m][j+m] = a[i][j]; } } void tournament(int n) { if(n == 1) { a[1][1] = 1; return; } if(odd(n)) { tournament(n+1); return; } tournament(n/2); makecopy(n); } int odd(int n) { if(n%2==1)

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档