魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。求解:魔术师手中牌的原始顺序是什么样子的?
用到的类:结点类,用于创建结点,链表的初始化和保存牌序。
/** * @ClassName: Node * @Description 本类功能:结点类,用于链表的初始化以及创建结点 * @Author lzl * @Date 2020.10.04 * @Time 14:52 */ public class Node < T > { private T data; private Node < T > prior; private Node < T > next; public Node ( T data , Node < T > prior , Node < T > next ) { this.data = data; this.prior = prior; this.next = next; } public T getData ( ) { return data; } public void setData ( T data ) { this.data = data; } public Node < T > getPrior ( ) { return prior; } public void setPrior ( Node < T > prior ) { this.prior = prior; } public Node < T > getNext ( ) { return next; } public void setNext ( Node < T > next ) { this.next = next; } public Node ( ) { } }魔术师发牌类,解决魔术师发牌问题:
/** * @ClassName: MagicProblem * @Description 本类功能:解决魔术师发牌问题 * @Author lzl * @Date 2020.10.04 * @Time 15:19 */ public class MagicProblem { public static void main ( String[] args ) { Node < Integer > head = new Node <> (); init ( head , 13 );//初始化 licensing ( head );//设置牌序 cardOrder ( head );//输出牌序 } private static void cardOrder ( Node < Integer > head ) { String[] poker = new String[] { "♠A" , "♠2" , "♠3" , "♠4" , "♠5" , "♠6" , "♠7" , "♠8" , "♠9" , "♠10" , "♠J" , "♠Q" , "♠K" , }; Node < Integer > temp; for ( temp = head.getNext (); temp.getNext () != head.getNext () ; temp = temp.getNext () ) { System.out.print ( poker[ temp.getData () - 1 ] + "-->" ); } System.out.println ( poker[ temp.getData () - 1 ] ); } private static void licensing ( Node < Integer > head ) { head.getNext ().setData ( 1 ); int count = 2; Node < Integer > temp = head.getNext (); while ( true ) { for ( int i = 0 ; i < count ; i++ ) { temp = temp.getNext (); if ( temp.getData () != 0 ) { temp = temp.getNext (); i--; } } if ( temp.getData () == 0 ) { temp.setData ( count ); count++; } if ( count == 14 ) { break; } } } private static void init ( Node < Integer > head , int num ) { Node < Integer > first = new Node <> (); head.setNext ( first ); first.setData ( 0 ); first.setNext ( first ); first.setPrior ( first ); for ( int i = 1 ; i < num ; i++ ) { Node < Integer > temp = new Node <> (); temp.setData ( 0 ); Node < Integer > end = first.getPrior (); end.setNext ( temp ); temp.setPrior ( end ); temp.setNext ( first ); first.setPrior ( temp ); } } }程序截图: