- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《ACM算法与数据结构设计》大作业模板.doc
《ACM算法与数据结构设计 生 陈 志
指 导 单 位 计算机学院软件工程系
日 期 2011.5.24
成 绩 批阅人 陈 志 日 期 2011.6.1
注意事项
(1)课程大作业从《ACM算法与数据结构设计ACM程序设计过程的收获、遇到的问题,遇到问题解决问题过程的思考、程序调试能力的思考等分析概要设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义。详细设计各个功能模块算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。分析测试数据,测试输出的结果每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),的改进设想。ACM算法与数据结构设计 生 陈 志
学 期 2010-2011-2
《ACM算法与数据结构设计
《ACM算法与数据结构设计 生 陈 志
指 导 单 位 计算机学院软件工程系
日 期 2011.5.24
成 绩 批阅人 陈 志 日 期 2011.6.1
一、课题名称
全排列
时间限制(普通/Java):1000MS/3000MS ? ? ? ?? 运行内存限制:65536KByte
给定n个整数,现请编程求它们所有的全排列。
输入
输入包括两个行,第一行给出正整数n( 0 n =8), 第二个是 n个整数(大小范围:[-10^4, 10^4])。
输出
按字典序输出这n个整数的全排列,每一行给出一个全排列。
样例输入
31?23?88
样例输出
1?23?881?88?2323?1?8823?88?188?1?2388?23?1分析全排列的生成就是对于给定的字符集或数集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。对给定的字符集中的字符规定一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后,或根据给定的数集中的大小关系,规定两个全排列的先后是从左到右逐个比较对应的数的大小,即依照字典序给出全排列。例如字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:1 2 31 3 22 1 32 3 13 1 23 2 1概要设计print_permutation函数,这是整个函数的最关键的部分,达到打印所有全排列的效果。
五、详细设计
1,主函数:
int main() {
int n,i;
scanf(%d, n);
for(i = 0; in; i++)
scanf(%d, arr[i]);
qsort(arr, n, sizeof(arr[0]), cmp);
print_permutation(n,0);
return 0;
}
2、qsort函数:
//qsort的比较函数
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
3、关键的自定义函数部分
void print_permutation(int n, int cur) {
int i, j;
if (cur == n) { //递归边界
for (i = 0; i n; i++)
if (i)
printf( %d, arr[A[i]-1]);
else
printf(%d, arr[A[i]-1]);
printf(\n);
} else for (i=1; i=n; i++) { //尝试在A[cur]中填各种整数i
int ok = 1;
for (j=0;jcur;j++)
if (A[j] == i) //如果i已经在A[0]~A[cur-1]出现过,则不能再选
ok =0;
if (ok) {
A[cur] = i;
print_
文档评论(0)