正文

69.魔术师的猜牌术(1)2005-09-10 15:18:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/1719.html

分享到:

69.魔术师的猜牌术(1) 魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的? *问题分析与算法设计 题目已经将魔术师出牌的过程描述清楚,我们可以利用倒推的方法,很容易地推出原来牌的顺序。 人工倒推的方法是:在桌子上放13空盒子排成一圈,从1开始顺序编号,将黑桃A放入1号盒子中,从下一个空盒子开始对空的盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数,顺序放入3、4、5...,直到放入全部3张牌。注意在计数时要跳过非空的盒子,只对空盒子计数。最后牌在盒子中的顺序,就是魔术师手中原来牌的顺序。 这种人工的方法是行之有效的,计算机可以模拟求解。 *程序与程序注释 #include<stdio.h> int a[14]; void main() { int i,n,j=1; /*j:数组(盒子)下标,初始时为1号元素*/ printf("The original order of cards is:"); for(i=1;i<=13;i++) /*i:要放入盒子中的牌的序号*/ { n=1; do{ if(j>13) j=1; /*由于盒子构成一个圈,j超过最后一个元素则指向1号元素*/ if(a[j]) j++; /*跳过非空的盒子,不进行计数*/ else{ if(n==i) a[j]=i; /*若数到第i个空盒子,则将牌放入空盒中*/ j++;n++; /*对空盒计数,数组下标指向下一个盒子*/ } }while(n<=i); /*控制空盒计数为i*/ } for(i=1;i<=13;i++) /*输出牌的排列顺序*/ printf("%d ",a[i]); printf("\n"); } *运行结果 The original order of cards is:1 8 2 5 10 3 12 11 9 4 7 6 13

阅读(5364) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册