- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
04 模拟 - 朴秀峰
朴秀峰 xfpiao@126.com 问题求解与程序设计 程序举例 约瑟夫问题 排列 模拟发牌 扑克牌中的顺子 过桥问题 约瑟夫问题 问题描述 有n 只猴子,按顺时针方向围成一圈选大王(编号从1到 n),从第1号开始报数,一直数到 m,数到 m 的猴子退出圈外,剩下的猴子再接着从 1 开始报数。就这样, 直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入 n, m 后,输出最后猴王的编号。 输入要求 每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 m, n 300)。最后一行 是:0 0。 输出要求 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号。 输入样例 输出样例 6 2 12 4 8 3 0 0 5 1 7 约瑟夫问题 int aLoop[MAX_NUM + 10]; int n, m, i; while(1) { (1) 读数据 (2) 找猴王 } (1) 读数据 scanf( %d%d, n, m); if ( n == 0 ) break; for( i = 0; i n; i ++ ) aLoop[i] = i+1; 约瑟夫问题 (2) 找猴王 int nPtr = 0; for( i = 0; i n; i ++ ) { //每次循环将 1 个猴子全赶出圈子, //最后被赶出的就是猴王 int nCounted = 0; while( nCounted m ) { //数出 m 个猴子 while( aLoop[nPtr] == 0) //跳过已经出圈的猴子 nPtr = ( nPtr + 1 ) % n; //到下一个位置 nCounted ++; //找到一只猴子 nPtr = ( nPtr + 1 ) % n; //到下一个位置 } nPtr --; //要回退一个位置 if( nPtr 0 ) nPtr = n - 1; if( i == n-1 ) //最后一只出圈的猴子 printf(%d\n, aLoop[nPtr]); aLoop[nPtr] = 0; //猴子出圈 } 排列 问题描述 大家知道,给出正整数 n,则 1 到 n 这 n 个数可以构成 n!种排列,把这些排列按照从 小到大的顺序(字典顺序)列出,如 n=3 时,列出 1 2 3, 1 3 2, 2 1 3, 2 3 1, 3 1 2, 3 2 1 六个排列。 给出某个排列,求出这个排列的下 k 个排列,如果遇到最后一个排列,则下 1 排列为第1 个排列,即排列 1 2 3 … n。 比如:n=3,k=2 给出排列 2 3 1,则它的下 1 个排列为 3 1 2,下2个排列为 3 2 1,因 此答案为 321。 输入数据 第一行是一个正整数 m,表示测试数据的个数,下面是 m 组测试数据,每组测试数据 第一行是 2 个正整数 n ( 1≤n≤1024 )和 k (1≤k≤64),第二行有 n 个正整数,是 1, 2, …, n 的一个排列。 输出要求 对于每组输入数据,输出一行,n 个数,中间用空格隔开,表示输入排列的下 k 个排列。 排列 输入样例 输出样例 3 3 1 2 3 1 3 1 3 2 1 10 2 1 2 3 4 5 6 7 8 9 10 3 1 2 1 2 3 1 2 3 4 5 6 7 9 8 10 排列 求X={1, 2, 3, 4, 5, 6, 7} 上排列 P= 2 6 3 7 5 4 1 的下一个排列Q 从右到左找出比右边数字小的第一个数,即 3。 再从右到左考察比 3 大的最小的数,是 4 。 将 3 与 4 对换位置,得 2647531 。 将得到的排列 2647531 从 4 后面的 7531 从小到大排序得 1357 。 把前缀 264 接在 1357 的前面得 2641357,它就是所求的排列 2637541 的下一个排列。 例 2147635 的下 2 个排列是 2153467 排列 设 X = { 1, 2 , …, n },求 P = a1a2…an 的下一个排列: 1) 从 an 开始,往左边找,直到找到某个 aj,满足 aj-1 aj。 2) 在 aj , aj+1 , … , an 中找到最小的比 aj-1 大的数,将这个数和 aj-1 互换位置。 3) 将从位置 j 到位置 n 的所有数(共 n-j+1 个)从小到大重新排序,排好序后,新的排列就是所要求的排列。 排列 int an[MAX_NUM + 10]; //用以排序的比较函数 int MyCompare( const
文档评论(0)