華為機試 計算麻將的番數(高階題160分)

2021-06-28 04:39:34 字數 2902 閱讀 8930

麻將和牌有兩種形式,即:

模式1 :11,11,11,11,11,11,11      

模式2: 11,123,123,123,123(全部或者部分123可以被111,1111替代)

注:123=連續3張同花色牌,如4d5d6d。111=3張同樣的牌,如3t3t3t。

條=t,筒=d

模式1即稱之為「巧7對」,一組牌剛好是7對牌。但是這裡有乙個疑問,「對」能否重複,即「槓」能否能當作2「對」(即題目中的「四歸一」)。正常的和牌最後手中總共有14張牌,實際生活中以模式1和牌並且計算帶「槓」的翻番是不可能的。

模式2有很多變種。首先123是指連續花色的3張牌,諸如「1條2條3條」或「4筒5筒6筒」等等。也可以是三種同花色的,如「1筒1筒1筒或「9條9條9條」。倘若你有了或者這樣的一組牌,別人又出了一張同樣的牌或者你接到一張同樣的牌,這個時候就是「四歸一」或者「槓」了。

日常生活中,實際上每乙個「槓」,你都需要宣告(不管是明「槓」或是暗「槓」),然後再接一張牌,也就是說,隨著你每宣告你有1個槓,最後和牌的時候你的牌都遞增1張。假設這樣的場景,你手中有13張牌,其中有一組牌「2條2條2條」,這時你又接到一張「2條」,那麼你有兩個選擇。(1)宣告你接到乙個「槓」,即暗槓,然後你再接一張牌,倘若你此時和牌,那麼你的牌有13+1+1=15張,當然這不是巧7對;倘若不和牌,你必須打出去一張並接著打下去。(2)倘若你不宣告,又剛好組成了巧7對,那你可以和牌了此時共有14張牌,但這「2條2條2條2條」並不是「槓」因為你並未宣告,你只能當兩對使用。倘若你沒有和牌,那你就必須打出去一張牌了,即手上只有13張牌了。

總的來說,實際生活中,你手中出現了「四歸一」,要麼宣告,然後你多接一張牌,按照模式2和牌。要麼你不宣告,按照模式1和牌。

但此處的題目並沒有具體說明,處於嚴謹的考慮,模式1帶「四歸一」和牌,即沒有宣告的「槓」,我也是是計算了番數的。

程式中和牌方式和番數的舉例如下:

模式1:

1t1t,2d2d,3t3t,4d4d,5d5d,6d6d,7t7t.  巧7對:2番

1t1t, 2d2d,3t3t,4d4d,5d5d,6d6d6d6d.  巧7對+1「四歸一」== 2+2=4番

1t1t, 2d2d,3t3t3t3t ,5d5d,6d6d6d6d.  巧7對+2「四歸一」== 2+4=6番

1t1t, 2d2d2d2d,3t3t3t3t , 6d6d6d6d.  巧7對+3「四歸一」== 2+6=8番

模式2:

1t1t,2d3d4d,4d5d6d,7d8d9d,2t3t4t.       0番

1t1t,2d3d4d,4d5d6d,7d8d9d,1t2t3t.       1番

1t1t,2d2d2d2d,4d5d6d,7d8d9d,2t3t4t.     2番

1t1t,2d2d2d2d,4d5d6d,7d8d9d,1t2t3t.     1「四歸一」+卡2條==2+1=3番

1t1t,2d2d2d2d,5t5t5t,7d8d9d,1t2t3t.     1「四歸一」+卡2條==2+1=3番

模式2中,全部或者部分連續三張同花色的一組牌如「2t3t4t或「7d8d9d」都可以被同花色的相同三張牌如「5t5t5t」 替代,如上。甚至是連續4張相同牌即「四歸一」替代,如下,當然後者計算番數。

1t1t,2d2d2d,5d5d5d5d,7d7d7d7d,5t6t7t.      2「四歸一」==4番

1t1t,2d2d2d2d,5d5d5d5d,7d7d7d7d,1t2t3t.    3「四歸一」+卡2條==6+1=7番

1t1t,2d2d2d2d,5d5d5d5d,7d7d7d7d,3t3t3t3t.  4「四歸一」==8番

1t1t,2d2d2d2d,4d5d6d,1t2t3t,1t2t3t.     2+1+1=4番

1t1t,2d2d2d2d,1t2t3t,1t2t3t,1t2t3t.     2+1+1+1=5番

輸入: 最多18張牌,故最大儲存空間為2*18+4','+1'.'+'\0'=42

遍歷字串:

1)判斷是否出現連續三種同花色牌(ka),如形如「4d5d6d」。在這種情況下,判斷(ka2tiao)是否出現卡2條即「1t2t3t」。

2) 判斷(lian3)是否出現連續3張相同牌如「7t7t7t」

3) 判斷(gang)是否出現「四歸一」並計數。

輸出:

1) 倘若連續三張同花色牌4d5d6d一組牌出現,或者連續三張相同牌7t7t7t的一組牌牌出現,或者「四歸一」出現了4次,

那麼和牌是按照模式2和牌。

番數=「卡2條」次數*1 + 「四歸一」的次數*22) 模式1即巧7對和牌

番數=2+2*「四歸一」的次數

#include #include using namespace std;

int main()

} }

if(ka||lian3||gang==4)//存在nt(n+1)t(n+2)t或2d2d2d的或者4個「四歸一」情況,必定是第2種和牌方式

fan=ka2tiao*1+gang*2;

else

fan=2+gang*2;//巧七對的和牌方式

華為機試 輸出含「23」的數

輸入一行數字 123 423 5645 875 186523 在輸入第二行 23 將第一行中含有第二行中 23 的數輸出並排序 結果即 123 423 186523 先排序,順序遍歷每個數字,看是否含有23 include includeint cmp const void a,const void...

華為機試 明明的隨機數

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 1000 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序...

華為機試 明明的隨機數

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 1000 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序...