70.魔术师的猜牌术(2) 魔术师再次表演,他将红桃和黑桃全部迭在一起,牌面朝下放在手中,对观众说:最上面一张是黑桃A,翻开后放在桌上。以后,从上至下每数两张全依次放在最底下,第三张给观众看,便是黑桃2,放在桌上后再数两张依次放在最底下,第三张给观众看,是黑桃3。如此下去,观众看到放在桌子上牌的顺序是: 黑桃 A 2 3 4 5 6 7 8 9 10 J Q K 红桃 A 2 3 4 5 6 7 8 9 10 J Q K 问魔术师手中牌的原始顺序是什么? *问题分析与算法设计 本题可在上题的基础上进行编程,不同的在于计数的方法和牌的张数,这些并不影响我们求解题目的思路,仍可按照倒推的方法,得到原来魔术师手中的牌的顺序。 *程序与程序注释 #include<stdio.h> int a[27]; void main() { int i,n,j=1; a[1]=1; /*初始化第一张牌*/ printf("The original order of cards is:(r:rad b:block):\n"); for(i=2;i<=26;i++) { n=1; do{ if(j>26) j=1; /*超过最后一个元素则指向1号元素*/ if(a[j]) j++; /*跳过非空的盒子,不进行计数*/ else{ if(n==3) a[j]=i; /*若数到第3个空盒子,则将牌放入空盒中*/ j++; n++; /*对空盒计数,数组下标指向下一个盒子*/ } }while(n<=3); /*控制空盒计数为3*/ } for(i=1;i<=26;i++) /*输出牌的排列顺序*/ { printf("%c",a[i]>13? 'r':'b'); printf("%d ",a[i]>13? a[i]-13:a[i]); if(i==13) printf("\n"); } printf("\n"); } *运行结果 The original order of cards is:(r:rad b:black): b1 r6 b10 b2 r12 r3 b3 b11 r9 b4 r7 b12 b5 r4 r13 b6 b13 r11 b7 r5 r1 b8 r8 r10 b9 r2

评论