魔术师发牌问题和拉丁方阵问题

魔术师发牌问题

  问题描述:

魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示。”魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上这样依次进行将13张牌全部翻出,准确无误。

问题:牌的开始顺序是如何安排的?

   思路就是用一个循环链表来解决问题,

  1. 初始化一个长度为13的循环链表,且各节点的初始化值为0
  2. 依次数count = 1~13次,将数到的牌的节点进行置为对应的 count,例如最开始将head置为1,然后数两次,head = head.next.next,即第三张置为2,并且在计数的过程中遇到节点的值不为点的则跳过不计数

拉丁方阵问题

  拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中 恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名。 

  例如下图是一个3×3的拉丁方阵:

  思路:

  1. 首先将第一行和第一列依次置为1~n,然后按循环链表的方法依次填充每一行
  2. 例如,第二行开头为2,则剩下的依次填充为3,4,。。。,n,1
  3. 第三行开头为3,则剩下的依次填充为4,5,。。,n,1,2  以此类推

 

 

 

 

原文地址:https://www.cnblogs.com/mukekeheart/p/5748597.html