本帖最后由 小歪 于 2014-3-16 21:36 编辑
/*
魔术师的猜牌术
魔术师再次表演,他将红桃和黑桃全部迭在一起,牌面朝下放在手中,对观众说:
最上面一张是黑桃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
问魔术师手中牌的原始顺序是什么?
*/
/*
**问题分析与算法设计**
*
按照倒推的方法,得到原来魔术师手中的牌的顺序。
*/
public class TestJava{
public static int a[]=new int[27];
public static void main(String args[] )
{
int i,n,j=1;
a[1]=1; //初始化第一张牌
System.out.printf("The original order of cards is:\n");
for(i=2;i<=26;i++)
{
n=1;
do{
if(j>26) j=1; //超过最后一个元素则指向1号元素
if(a[j]!=0) j++; //跳过非空的盒子,不进行计数
else{
if(n==3) a[j]=i; //若数到第3个空盒子,则将牌放入空盒中
j++; n++; //对空盒计数,数组下标指向下一个盒子
}
}while(n<=3); //控制空盒计数为3
}
for(i=1;i<=26;i++) //输出牌的排列顺序
{
System.out.printf("%c",a>13? '\3':'\6');
System.out.printf("%d ",a>13?a-13:a);
if(i==13) System.out.println();
}
System.out.println();
}
}
运行结果:
|