问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

简单序列分组算法详解:从扑克牌分发问题到通用解决方案

创作时间:
作者:
@小白创作中心

简单序列分组算法详解:从扑克牌分发问题到通用解决方案

引用
CSDN
1.
https://blog.csdn.net/sinat_39215814/article/details/136972247

本文将通过一个简单的扑克牌分发问题,详细讲解序列分组的基本思路和算法实现。这个问题虽然简单,但通过深入分析,可以帮助我们理解序列分组背后的逻辑推理过程。

问题描述

现有一副扑克牌,需要按顺序轮流发给三个玩家,编写算法实现这一过程。

分析思路

  1. 首先我们将扑克牌放进一个数组,数组从1开始,每个数字代表一张牌,如下:

    [ 1, 2, 3, 4, 5, 6, 7, 8, 9, ……, 54 ]
    
  2. 我们截取一个片段来分析它的规律,后再同步到整个数组,如下:

    [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
    
  3. 假设三名玩家分别为A,B,C,我们可以观察到这样的结果:

  • A玩家获得的牌为:1, 4, 7, 10
  • B玩家获得的牌为:2, 5, 8
  • C玩家获得的牌为:3, 6, 9
  1. 为了更加清晰,我们将他们分别提取出来:
  • A[1, 4, 7, 10]
  • B[2, 5, 8]
  • C[3, 6, 9]
  1. 我们先来看A玩家的牌的规律:
  • 因为我们有三个玩家,每一轮都要发出三张牌之后才可以进入下一轮,那么A玩家总是每一轮的第一张牌,也就是每一轮(3张发完)结束后的下一张牌。
  • 那么我们可以得到A玩家手牌的规律为:[ 1, 3+1, 3+3+1, 3+3+3+1 ],也就是[ 3 x 0 +1, 3 x 1 +1, 3 x 2 +1, 3 x 3 +1 ],简化一下可以得到A[ 3n + 1 ]
  1. 同理B玩家的规律为:
  • [ 2, 3+2, 3+3+2 ][ 3 x 0 +2, 3 x 1 +2, 3 x 2 +2, 3 x 3 +2 ],简化后得到B[ 3n +2 ]
  1. C玩家的规律为:
  • [3,3+3,3+3+3][ 3 x 0 +3, 3 x 1 +3, 3 x 2 +3 ],简化得C[ 3n + 3],再合并一下得C[ 3(n + 1) ]
  1. 这个时候我们就得到了:
  • A玩家的规律:A[ 3n + 1 ]
  • B玩家的规律:B[ 3n +2 ]
  • C玩家的规律:C[ 3n + 3]/C[ 3(n + 1) ]
  1. 他们三者共有的部分都是 + 3n,我们把这个共有的部分去掉就能够得到每个玩家独有的特点。在数学里,3n 代表了可以被3整除,而后面多出来的部分就成了除不尽剩下的余数,于是我们就得到了下面的规律:
  • A = (3n + 1) % 3 = 1
  • B = (3n + 2) % 3 = 2
  • C = (3n + 3) % 3 = 0
  1. 那么,一个从1开始的数组,我们就可以这样去分配(注意循环设定从1开始):

  1. 但是计算机里数组的索引都是从0开始的,所以我们反直觉的要将所有的排号往前退一位,也就是余数都减去1,得:
  • A = (3n + 0) % 3 = 0
  • B = (3n + 1) % 3 = 1
  • C = (3n + 2) % 3 = 2
  1. 最后算法得代码就变成了这样:

结论

要将一个序列按顺序分发给N个组,就除以N取余获得每一个元素所属得分组,在计算机里面分的话,记得第一个位置是0索引,所以余数也得往前退1。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号