撲克牌的順子

2021-06-21 08:12:58 字數 1630 閱讀 6243

題目:從撲克牌中隨機抽

5張牌,判斷是不是乙個順子,即這

5張牌是不是連續的。

2-10

為數字本身,a為

1,j為

11,q為

12,k為

13,而大小王可以看成任意數字。

分析:這題目很有意思,是乙個典型的寓教於樂的題目。

我們需要把撲克牌的背景抽象成計算機語言。不難想象,我們可以把

5張牌看成由

5個數字組成的陣列。大小王是特殊的數字,我們不妨把它們都當成

0,這樣和其他撲克牌代表的數字就不重複了。

接下來我們來分析怎樣判斷

5個數字是不是連續的。最直觀的是,我們把陣列排序。但值得注意的是,由於

0可以當成任意數字,我們可以用

0去補滿陣列中的空缺。也就是排序之後的陣列不是連續的,即相鄰的兩個數字相隔若干個數字,但如果我們有足夠的

0可以補滿這兩個數字的空缺,這個陣列實際上還是連續的。舉個例子,陣列排序之後為。在1

和3之間空缺了乙個

2,剛好我們有乙個

0,也就是我們可以它當成

2去填補這個空缺。

於是我們需要做三件事情:把陣列排序,統計陣列中

0的個數,統計排序之後的陣列相鄰數字之間的空缺總數。如果空缺的總數小於或者等於

0的個數,那麼這個陣列就是連續的;反之則不連續。最後,我們還需要注意的是,如果陣列中的非

0數字重複出現,則該陣列不是連續的。換成撲克牌的描述方式,就是如果一副牌裡含有對子,則不可能是順子。

基於這個思路,我們可以寫出如下的**:

// determine whether numbers in an array are continuous

// parameters: numbers: an array, each number in the array is between

//             0 and maxnumber. 0 can be treeted as any number between

//             1 and maxnumber

//             maxnumber: the maximum number in the array numbers

bool

iscontinuous(std::vector numbers, int maxnumber)

// get the total gaps between all adjacent two numbers

std::vector::iterator biggernumber = smallernumber + 1;

while(biggernumber < numbers.end())

return (numberofgap > numberofzero) ? false : true; }

本文為了讓**顯得比較簡潔,上述**用

c++的標準模板庫中的

vector

來表達陣列,同時用函式

sort

排序。當然我們可以自己寫排序演算法。為了有更好的通用性,上述**沒有限定陣列的長度和允許出現的最大數字。要解答原題,我們只需要確保傳入的陣列的長度是

5,並且

maxnumber為13

即可。

撲克牌順子

ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子.ll不高興了,他想了想,決定大 小...

撲克牌順子

題目描述 ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子 ll不高興了,他想了想,...

撲克牌順子

ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子 ll不高興了,他想了想,決定大 小...