Lesson_4 作业_1 ---- 魔术师的秘密
1 /******************************题目描述*********************************** 2 * 在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后, 3 * 把牌面朝下,对观众说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口 4 * 中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余 5 * 牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2, 6 * 也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张 7 * 牌,正好是黑桃3,这样依次将13张牌翻出,准确无误。现在的问题是,魔术师手中 8 * 牌的原始顺序是怎样的? 9 ********************************解题思路*********************************** 10 * 解决这类问题的关键在于利用倒推的方法推出原来牌的顺序。 11 * 假设桌上摆着13个空盒子,编号为1至13,将黑桃A放入第一个盒子中,从下一个 12 * 空盒子开始对空盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再 13 * 从下一个空盒子开始对空盒子计数。顺序放入3,4,5等,直到全部放入13张牌,注意 14 * 在计数时要跳过非空的盒子,只对空盒子计数,最后得到的牌在盒子中的顺序,就是 15 * 魔术师手中原来牌的顺序。 16 * 17 ********************************注释*********************************** 18 * 2012-1-14 by 樊列龙 19 ****************************************************************************/ 20 21 public class 魔术师的秘密{ 22 public static void main(String []args){ 23 int []poker = new int[14]; 24 String []pokerStr = {"0","A","2","3","4","5","6","7","8","9","10","J","Q","K"}; 25 int mem = 1; 26 int j = 1; 27 for(int i = 1; i < 14; i++){ 28 int n = 0; 29 for(j = mem; n != i; j++){ 30 if (j > 13) j = 1; 31 if(poker[j] == 0){ 32 n++; 33 } 34 } 35 mem = j--;//这里的自减必不可少,并且只能是后置的自减 36 poker[j] = i; 37 } 38 39 // for(int i = 1; i < 14; i++){ 40 // System.out.print(poker[i] + " "); 41 // } 42 // System.out.println(); 43 44 for(int i = 1; i < 14; i++){ 45 System.out.print(pokerStr[poker[i]] + " "); 46 } 47 System.out.println(); 48 } 49 }
老师的程序
1 //老师写的13-01-15 2 public class 魔术师的秘密{ 3 public static void main(String []args){ 4 int []pokers = new int[14];//从1开始用 5 int total = 1;//13张牌 6 int index = 1;//当前数组的位置 7 int count = 1;//计数器 8 9 10 for(;total != 14;){ 11 if(index > pokers.length-1){ 12 index = 1; 13 } 14 if(pokers[index] == 0){//检查当前位置是否有牌 15 if(count == total){ 16 pokers[index] = total;//放下牌 17 count = 1;//计数器复位 18 total++;//开始下一张牌 19 index++;//计数器的位置后移一位 20 } else { 21 count++; 22 index++; 23 } 24 }else{ 25 index++; 26 } 27 } 28 29 for(int i = 1; i < 14; i++){ 30 System.out.print(pokers[i] + " "); 31 } 32 } 33 }
运行结果: