演算法題 關於麻將是不是炸和?

2021-08-08 11:03:14 字數 2780 閱讀 3483

最近參加聯發科程式設計比賽的題目,有好多感覺並不是很難的題目但是當時就是沒有思路或者有了思路寫不出具體**。現在比賽過後還是希望把沒有做出來的題目重新做一遍。

題目如下

麻將是國粹,更是成都的生活重心。作為乙個成都人,一定要把麻將發揚光大。現在組織有乙個重要的任務要交給你:請你設計乙個判斷是否炸和的程式。

什麼是炸和?

炸和(和讀炸胡),是指達不到和牌條件就把牌推倒了。

那什麼是和牌呢?

和牌代表你贏了。當你手上的牌符合三種和牌牌型之一時,就是和牌,可以推倒牌收錢啦。

【三種和牌牌型】

1. 普通牌型,14張牌,形如:3+3+3+3+2。其中數字2代表兩張相同的牌可成一組,形如xx。數字3代表三張相同或者連續的牌可成一組,形如***、xyz。

2. 暗七對,14張形如:2+2+2+2+2+2+2。

3. 帶槓,即普通牌型裡三張一樣的牌***可以公升級成***x,稱為一道槓。每多一道槓,牌總數可以增加一張。最多可以有4道槓,因此帶槓的和牌,牌總數最多可以達18張。

【牌的表示方式】

abcdefghi代表一到九萬,abcdefghi代表一到九條,123456789代表一到九餅。

先來練習一下:

abceee345456dd 和牌,組牌方式為 abc+eee+345+456+dd,普通牌型。

abeeee345456dd 炸和,因為ab兩張牌未能形成組牌。

aaaabc123456333 炸和,雖然看似組牌ok(aaa+abc+124+345+456+333)但是不符合任何一種和牌牌型。

aaddff1133aagg 和牌,暗七對。

aaaabbbbccccdddd88 和牌,3+3+3+3+2牌型,公升級了4道槓。

aaa123789 炸和,不符合任何一種牌型。

aaa111345666def88 炸和,不符合任何一種牌型。

現在給你一副牌,請用你的程式來判斷這副牌是和牌還是炸和。

【輸入說明】

在程式當前目錄下存在execute.stdin檔案,程式從execute.stdin中取得輸入資料。

execute.stdin為單行檔案,裡面存放著乙個字串,代表一副牌。參考上面牌的表示方式。

注意:牌序是亂的,請自己組牌。

【輸出說明】

若這副牌已經和牌,輸出good,炸和則輸出bad。

【樣例】

execute.stdin內容:123bcd999abd66

輸出:bad

思路分析:

和牌的型別題目中已經說的很清楚,一共有三種情況:

普通牌形,即3*x + 2的情況

暗七對,即七個對子7*2

帶槓,即3*x + 4*y + 2的情況

不明白和牌的型別中為啥有暗槓的情況,平時打牌時暗槓不是可以直接翻倍的嘛?可能我打的是假的川麻吧。。。

首先讀取輸入的字串,得到字串的長度str_len,然後定義乙個長度為str_len的陣列mj,將字串轉換為數字儲存在mj陣列中;有萬條筒共有27種牌,所以定義乙個大小為27的c陣列,將每張牌出現的次數放在c陣列中。

str_len如果為14時可能出現前兩種情況的和牌,如果str_len大於14小於等於18時可能出現第三中情況的和牌,否則和不了牌。

具體c++**如下:

#include 

#include

#include

#include

using

namespace

std;

int c[27];

int str_len = 0;

char str[18];

int mj[18];

bool search(int dep)

}for (i = 0; i <= 24; i++) if (i % 9

<= 6 && c[i] >= 1 && c[i + 1] >= 1 && c[i + 2] >= 1)

return

false;

}bool check()

if (c[i] >= 2)

}return

false;

}int main(void)

for (int i = 0; i < str_len; i++)

else

if (isupper(str[i]))

else

if (islower(str[i]))

}for (int j = 0; j < str_len; j++)

c[mj[j]]++;

if (str_len == 14)

else

if ((c[mj[1]] == 2) && (c[mj[2]] == 2) && (c[mj[3]] == 2) && (c[mj[4]] == 2) && (c[mj[5]] == 2) && (c[mj[6]] == 2) && (c[mj[0]] == 2))

else

}else

if ((str_len > 14) && (str_len <= 18))}}

}str_len = str_len - four_num * 4;

if (check())

else

}else

system("pause");

return

0;}

主要參考說說演算法題的那些事兒(3)~麻將演算法題,主要加上了判斷後兩種和牌的方式。

關於陣列的演算法題

1.當陣列中包含負數時,返回該陣列的最大連續子串行的和。例如 6,3,2,7,15,1,2,2 其連續子串行的最大和是8 從第0個開始,到第3個為止 子串行的長度至少為1。class solution def sum arr self,array sum 0 max 0 for data in ar...

java關於回溯演算法的題1

組合總和 組合總和 ii 組合總和 iii 組合總和 iv 全排列單詞搜尋 最大單詞長度乘積 1.組合總和 給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複...

關於一起奇葩的演算法題 資料儲存題

最近遇到一些奇葩的題,主要是資料結構和演算法,有些思路寫在這留個紀念。有一萬個無序的10位數字的qq號怎麼進行有序儲存,方便它記錄輸出,增 刪 改 查?思路 定義乙個多維陣列 10維 所有元素為0,qq號的數字拆解為多維陣列的下標,將其下標對應的元素修改為1。輸出也只是判斷元素為1的下標輸出,其他類...