1. 程式人生 > >麻將胡牌的演算法

麻將胡牌的演算法

清一色是麻將的種類之一,指有一種花色的序數牌組成的胡牌。

數字1-9,每個數字最多4張牌;

我們不考慮具體的花色,我們只看數字;

刻字:三張一樣的牌:111.222.333

順子:三張連續的牌123,46,789

對子:兩張連續的牌;11,22,33,44

需要一個程式實現,判定給定牌,是否可以和牌;

胡牌要求:麻將 牌張數只能是2,5,8,11,14

給定牌可以組合成,除1個對子以外的其他都是刻字或者順子

胡牌輸出YES否則NO

#include<stdio.h>

#include<iostream>
using   namespace std;
bool Group3Same(char *p, int n)
{
char * q;
int sp = 0;
int i, j;
q = p;
if (n == 0)
{
return true;
}
for (i = 0; i < n - 2; i++)
{
if (*(q + i + 1) == *(q + i) && *(q + i + 2) == *(q + i + 1))
{
if (i == n - 3)            //把這三個元素移除,把後面的元素往前移動三格
{
*(q + i) = '\0';
p = q;
return true;
}
else
{
for (j = i; j < n - 3; j++)
{
*(q + j) = *(q + j + 3);
}
*(q + j) = '\0';
p = q;
return true;
}
}
}
return false;
}
int Group3Shunzi(char *p, int n)
{
char *q, *w;
int i, j, k, m, l, sp = 0;
m = 0;
q = p;
w = p;
if (n == 0)
{
return 0;
} for (i = 0; i < n - 2; i++)
{
for (j = i + 1; j < n - 1; j++)
{
if (*(q + j) - *(q + i) == 1)
{
for (k = j + 1; k < n; k++)
{
if (*(q + k) - *(q + j) == 1)
{
if (i == n - 3)          //把這三個元素移除,把後面的元素往前移動三格
{
*(q + i) = '\0';
n -= 3;
i--;
break;
}
else
{
*(q + i) = '0';
*(q + j) = '0';
*(q + k) = '0';
for (m = 0, l = 0; l < n; l++)
{
if (*(q + l) != '0')
{
*(w + (m++)) = *(q + l);
}
}
n = m;
q = w;
i--;
break;
}
}
}
}
continue;
}
}
return  n;
}
bool Group3S(char *p, int n)
{
char pp[14], p2[14];
int i, j;
for (i = 0; i < n; i++)
{
pp[i] = *(p + i);
p2[i] = *(p + i);
}
bool flag = false;
if (n == 0)
{
return true;
}
if (!Group3Shunzi(p, n))
return true;
if (Group3Same(p2, n))               //順子出錯,就看看有沒有三個相同的,有就把三個相同的挑出來,在進行順子演算法
{
n -= 3;
flag = Group3S(p2, n);
}
return flag;
}
bool Group(char *pp, int n)
{
char q[14];
char r;
int i, j, k = 0;
r = '0';
for (i = 0; i < n; i++)
{
q[i] = *(pp + i);
}
if (n == 0)
{
return true;
}
else if (n % 3 == 2)              //必定存在一對對子
{
for (i = k; i<n - 1; i++)
{
if (*(q + i) == *(q + i + 1) && *(q + i) != r)     //找對子,並剔除對子
{
r = *(q + i);
for (j = i; j < n - 2; j++)
{
*(q + j) = *(q + j + 2);        //所有元素左移兩位
}
*(q + j) = '\0';


i--;
k = i;
if (Group3S(q, n - 2))           //某一花色組合正確
{
return true;
}
for (j = 0; j < n; j++)
{
q[j] = *(pp + j);          //恢復原來的陣列,並進行下一輪對子的選擇
}
}                //找出對子,並剔除,在剩餘的12張牌中進行組合
}
}
else                 //沒有對子,只能是三個三個一組(三個相同或者順子)
{
if (Group3S(q, n))
{
return true;             //某一花色組合正確
}
}
return false;   //輸了  
}


void main()
{
/*char s[11] ,*p;
p = s;
gets(p);
int n;
n = *p - '0';
while (*++p)
{
n = n * 7 + *p - '0';
}
printf("%d",n);*/
char *as1 = "11";  
char *as2 = "111222336";
char *as3 = "11122233369";
int d=Group(as3, 11);
if (d == 1)printf("%s", "yes");
else printf("%s","no");
cin.get();



}

相關推薦

C語言單純的模擬麻將演算法!簡單分析,不喜莫入

不帶賴子,14張牌,以筒子為例子,不考慮雜交系列,純屬探索性演算法,並非完整麻將演算法,請勿存在誤區。單純的模擬題, 簡單的搜尋。 1表示1筒 2表示2筒。。。。 9表示9筒。 小編給大家推薦一個學習氛圍超好的地方,C/C++交流企鵝裙:87096

麻將演算法python版

#coding:utf8 ##################### #作者:skillart #bolg:http://blog.csdn.net/skillart/article/details/40422885 # ##################### # 資料格

麻將演算法 極速(速度接近理論極限)

此麻將胡牌演算法優點: 1.可處理多賴子牌(萬能牌) 2.演算法速度極快:1ms可大約計算1W+副手牌是否可胡(帶賴子、0.08us左右),不帶賴子的牌型更快。(最新版的演算法速度感覺已很接近理論極限值) 3.不同玩法的麻將,可用同一套胡牌演算法,載入不同的胡牌配置檔案即可

麻將演算法

用數字代替麻將中的所有牌: 一萬~九萬    1~9 一筒~九筒    11~19 一條~九條    21~29 東、南、西、北、中、發、白    31~37 胡牌的種類:對對胡、十三么和33332 判斷胡牌的過程(以下所說的規則,都是針對手牌已經按從小到

帶賴子的超高效麻將、跑鬍子演算法

騰訊課堂視訊講解:https://ke.qq.com/course/305608?tuin=104cb0e2 文件 github地址 https://github.com/yuanfengyun/qipai/tree/master/doc lua版 https://github.com/yuan

麻將演算法

清一色是麻將的種類之一,指有一種花色的序數牌組成的胡牌。 數字1-9,每個數字最多4張牌; 我們不考慮具體的花色,我們只看數字; 刻字:三張一樣的牌:111.222.333 順子:三張連續的牌123,46,789 對子:兩張連續的牌;11,22,33,44 需要一個程式實現

檢測四川麻將是否演算法的實現

自己寫了一個四川麻將胡牌的演算法,加入有兩組牌讓你判定是否胡牌,就只是最簡單的那種胡法,非常不完善。 其中char *as1 = "1W1W2T2D3W3W5W5W7W7W8W8W9W9W";  char *as2 = "1W1W1W2W3W4W4W5W6W7W8W9

麻將簡單演算法

  1/***************************************************************  2  * 檔名:hu.cpp                                              *  3  * 

癩子麻將以及聽演算法實現

最先實現的就是演算法的實現。 需求:碰槓胡  ,不能吃 ,不能聽 ,只能自摸胡,其中癩子可以做任意牌但是不能碰和槓。 寫的時候還不會玩麻將,還是老闆教的。^_^ 最麻煩的是胡牌演算法。之前搜到的都是不包含癩子正常的胡牌,用的是%3餘2,其中餘數2就是餘的將的意思。 但是有癩

跑鬍子演算法

騰訊課堂視訊講解:https://ke.qq.com/course/305608?tuin=104cb0e2 1、 基於查表的lua版跑鬍子判胡演算法     將所有能胡的牌型和其對應的胡息放入表中     判斷胡牌時,只需要查表得到胡息,如果

微信小遊戲開發-麻將演算法(二)

麻將一組有1-9筒,1-9條,1-9萬,中發白,東南西北,34張牌,共有四組。 可以通過一個數組來表示則一組牌,程式碼如下: private final static String[] mahjong = { "1T", "2T", "3T", "4T", "5T",

【求助】華為OJ題 成都麻將規則

描述: 說起麻將,那可是川渝市民的最愛,無論親朋好友聚會,還是業務談判,總是少不了麻將的聲音。 成都麻將只能包括3種類型:條,筒,萬。沒有“門、東南西北、紅中”。 每種牌都是數字從1到9,每個數字有4張,共36張。筒,萬,條均一樣。 胡牌簡化規則如下: 1.必須有一個對子

基於概率與表的麻將AI演算法

github專案連結:https://github.com/yuanfengyun/mj_ai 麻將概率問題:1、已經四個玩家每人有13張手牌 2、桌上已經打出的牌 3、玩家A有1個確定的胡牌目標 問: 玩家A摸入5張牌胡牌的概率? 公式見圖:概率計算公式.jpg 整體思路

swift--廣東麻將v2.0(帶、聽演算法和自動打牌功能)

本程式實現了廣東麻將的全部功能:自動摸牌、打牌、碰、槓、聽牌、胡牌(其中莊家手動打牌,其它電腦玩家自動打牌),具體功能有: 系統通過骰子確定莊家,然後發牌,最開始從莊家手動打牌。 可以碰,槓,不能吃牌;沒有癩子。只能自摸。 所有玩家自動.碰、槓,在某個玩家打牌

node.js——麻將演算法(六)簡易版麻將AI1.0

普通麻將的出牌AI如果不是要求特別高的話,其實蠻容易實現的,畢竟大多數人打牌都只是看自己的手牌。 所以作為簡易版的AI,出牌的策略只要奔著胡牌去就可以了。我們能想到的就是把相鄰或相同的牌湊到一起,把單獨的牌打出去。以這個思路打牌,就會慢慢接近聽牌至最終的胡牌。 我們簡單舉

set 容器的使用(演算法筆記)

C++ Sets 集合(Set)是一種包含已排序物件的關聯容器 set insert 將x插入到容器當中自動遞增排序並去重 begin() 返回指向第一個元素的迭代器 clear() 清除所有元素

錯誤的洗演算法

最近看到一篇文章,上面介紹了12種JavaScript技巧,其中最後一種介紹了陣列元素的洗牌,程式碼很簡單 var list = [1,2,3]; console.log(list.sort(function() { Math.random() - 0.5 })); // [2,1,3]

演算法具體指的是什麼

這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【洗牌演算法具體指的是什麼】 標題: 【修真院web小課堂】洗牌演算法具體指的是什麼

演算法Fisher–Yates shuffle

在有個函式int rand(int n)返回1-n之間的隨機數。如何把陣列A[N]打亂? 最初的Fisher–Yates演算法是在另外開闢一個數組B[N],把打算後的A[N]放到B[N]中,步驟如下 設i=0 1、生成1-A.length長度之間的隨機數k 2、把A[

程式設計常用演算法分析——洗演算法

首先我們需要明白幾個數學思想—————————————— 一、 我們的洗牌演算法是偽隨機事件的一種。而隨機事件我們也要明白幾個概念   隨機數的特性: 隨機性:不存在統計學偏差,是完全雜亂的數列 不可預測性:不能從過去的數列推測出下一個出現的數 不可重現性:除