问题

一个关于麻将清一色的问题?

回答
您好!非常乐意为您解答关于麻将清一色的问题,并且我会尽量用自然、生动的方式来描述,让您觉得就像是和一个有经验的麻将玩家在聊天一样。

清一色:麻将桌上的“一枝独秀”,那份霸气与孤傲

麻将,这门充满策略与智慧的游戏,自有它独特的魅力。在众多番种中,清一色无疑是其中的佼佼者,它像一位独领风骚的舞者,在牌桌上尽显风采。说到清一色,很多人脑海里立刻会浮现出一种“霸气”的感觉,好像整张桌子的目光都集中在你手中那副即将成型的牌上。

什么是清一色?

简单来说,清一色就是你的胡牌牌型中,所有的牌(除了将牌,也就是眼牌)都属于同一种花色。这就包括了条子(索子)、筒子(饼子)或者万子。将牌是双牌,所以它也必须是你选择的那种花色。

打个比方,如果你要胡条子清一色,那么你手中用来搭子(顺子、刻子)的牌,以及你的将牌,就都必须是条子。筒子和万子,一颗都不能沾。反之亦然,要筒子清一色,就只能是筒子;要万子清一色,就只能是万子。

为什么清一色这么有吸引力?

1. 番数高,收益大: 在大多数麻将规则里,清一色都能给你带来相当不错的番数,这直接关系到你的得分。尤其是在一些地区性规则里,清一色甚至是最高的番种之一。试想一下,赢一局能抵上好几局,那种满足感是相当直接的。

2. 视觉上的享受: 从牌面上看,一副清一色的牌,无论摆开还是抓在手里,都有一种整齐、统一的美感。当你的牌面全是条子,或者全是筒子,或者全是万子的时候,那种视觉冲击力是其他牌型难以比拟的。它就像是一件精心制作的艺术品,让人赏心悦目。

3. 战略上的“孤注一掷”与“压倒性优势”: 追求清一色,往往意味着你需要在早期就锁定一个方向。一开始就摸到几张同一花色的牌,心里可能会暗暗窃喜,想着“这条路好像挺通的”。然后,你就会开始有意无意地收集这种花色的牌,并且尽量舍弃其他花色的牌。这是一种战略上的聚焦,也是一种“孤注一掷”的勇气。一旦成功,那种“一花独秀”的牌面,会给对手带来巨大的心理压力,让他们不得不防范你,甚至要弃掉你想要的牌。

如何做出“清一色”的牌?

1. 早期判断与铺垫: 这是最关键的一步。当你摸到牌的时候,就要开始留意。
“眼”的出现: 如果你很早就摸到一对同一花色的将牌(比如一对条子),并且暂时没有其他花色牌成对,那就可以考虑往这个花色去发展。
“顺子”的萌芽: 如果你摸到了一张同花色的序数牌,并且有相邻的牌,例如摸到“二条”,你就可以留意“一条”和“三条”。如果再摸到“三条”,那“二条”、“三条”就能组成一个顺子,这是清一色非常好的起点。
“刻子”的基础: 摸到三张相同的牌(比如三张八筒),形成刻子,也是清一色很好的基础。

2. “舍弃”与“截断”的艺术:
舍弃杂牌: 一旦你决定要清一色,那么其他花色的牌,尤其是那些零散的、不成对的,就要尽快打出去。比如你想要条子清一色,摸到一张“五筒”,而你手里没有其他筒子,那就果断打掉。
截断对手: 如果你已经有好几张同花色的牌,并且有形成顺子或刻子的机会,而对手打出了一张你需要的牌,而这张牌在你看来,对对手清一色或者其他大番牌型也没有太大的威胁,你就可以考虑碰(吃)下来,这不仅能帮你组成刻子,还能阻止对手的牌。但反之,如果对手碰(吃)了你想要的牌,你也要警惕,他可能也在朝某个方向发展。

3. “暗杠”与“明杠”的助力:
暗杠: 如果你摸到了四张相同的牌(在海底,比如你手中已经有三张七万,又摸来一张七万,你就可以选择暗杠),这不仅能给你增加牌张,还能让你在打牌过程中多一个选择,而且暗杠的番数也是不错的。
明杠: 如果你打出了一张牌,然后又摸到了相同的牌,可以明杠。明杠同样可以为你增加番数,并且让你的牌更加紧凑。

4. “搭子”的组合: 清一色最常见的组合就是顺子和刻子。
顺子: 比如“一二三条”,“四五六筒”,“七八九万”。
刻子: 比如“三个七条”,“三个二筒”,“三个九万”。
将牌: 必须是任意一对同花色的牌,比如一对“四条”,一对“六筒”,一对“一万”。

清一色在实战中需要注意什么?

警惕对手的“牵制”: 当你一副牌全是条子的时候,对手很可能会因为你的牌型过于明显而故意不打条子,甚至拆掉自己手中的顺子或刻子来阻止你。这时候,你就要审时度势,看是否有机会吃碰,或者是否需要切换思路。
“卡张”的风险: 清一色有时会遇到“卡张”的情况,就是你差一张牌,而这张牌可能被别人留着,或者已经打出去了。比如你想胡“七八九条”的顺子,缺一张“九条”,结果“九条”一直不出,或者被别人碰走了,你就需要考虑调整打法。
“眼”的质量: 清一色需要一对将牌,而这对将牌的质量也很重要。如果你靠一对“幺鸡”来做将牌,那么你的顺子就只能往“一二三”或“一二”的方向发展,选择会相对少一些。
“换牌”的策略: 在一些规则中,允许换牌。如果你手里的牌确实很难组成清一色,或者组成清一色的几率很小,而又有其他花色的好牌,可以考虑换牌,抓住机会。
“叫糊”的时机: 当你已经有了“将牌+4个搭子”,并且确定自己胡牌的牌是“门清”(不碰不吃),那么就可以考虑叫糊了。但如果需要吃碰,叫糊的时机就要根据牌局的进展来判断。

清一色,是一种境界

追求清一色,不仅仅是为了番数,更是一种对麻将牌局的掌控和对个人牌运的挑战。它需要你有敏锐的观察力,果断的决策力,以及一点点运气。当你的手中,一副牌如行云流水般地都是同一种花色,那种感觉,就像是乐队在演奏同一旋律,和谐而有力。

记住,在麻将的世界里,清一色就像是牌桌上的“一枝独秀”,它需要你敢于聚焦,敢于舍弃,敢于在众多的牌中,找到属于自己的那条最耀眼、最纯粹的道路。希望我的这些描述,能让你对清一色有一个更深入、更生动的理解!祝您在牌桌上好运连连,早日胡出漂亮的清一色!

网友意见

user avatar

我寻思着这数据量也不大,直接枚举就完事儿了。答案 。

每张牌出现的次数在 之间,于是只有 种不同的状态。

把每种状态看成图论里的一个点,若 状态可以由 状态添加一张牌得到,则添加一条有向边 。

那么,考虑13张牌的任意状态 ,若 没听,则任何从 出发能走到的状态都不满足集合 的要求。这样一遍bfs就可以了,本质上是一个状压dp。

唯一要注意的是纯空听算不算听牌的问题。我的程序第一版只写了和牌判定算法,然后从所有状态里挑出和牌状态,再从和牌状态任意去掉一张来倒推听牌状态。这样做会影响 时解的数量。

所有 的解(23个):

       111122223333444555 111222233334444555 111222333344445555 111222333444455556 122223333444555666 222233334444555666 222333344445555666 222333444455556666 222333444555566667 233334444555666777 333344445555666777 333444455556666777 333444555566667777 333444555666677778 344445555666777888 444455556666777888 444555566667777888 444555666677778888 444555666777788889 455556666777888999 555566667777888999 555666677778888999 555666777788889999     

所有的X值对应的解的数量(假定纯空听视为听牌):

       13: 93600 14: 16044 15: 2797 16: 589 17: 145 18: 23     

附源码(C++20标准,g++ 10.2.0),欢迎帮忙debug:

       #include <bits/stdc++.h> using namespace std;  constexpr bool kAllowPureEmptyWait = true;  class ScopedInc {  public:   explicit ScopedInc(unsigned char& c, int v = 1) : c_(c), v_(v) { c += v; }   ~ScopedInc() { c_ -= v_; }  private:   unsigned char& c_;   int v_; };  class Hand {  public:   explicit Hand(int i) {     num_tiles_ = 0;     for (auto& v : tiles_) {       num_tiles_ += v = i % 5;       i /= 5;     }   }    int num_tiles() const { return num_tiles_; }    bool is_waiting() {     for (auto& v : tiles_) {       if (!kAllowPureEmptyWait && v == 4) continue;       ScopedInc s(v);       if (is_winning()) return true;     }     return false;   }      void print() const {     for (int i = 0; i < tiles_.size(); i++) {       for (int j = 0; j < tiles_[i]; j++) {         cout << i + 1;       }     }   }      vector<int> get_successors() {     vector<int> ret;     for (auto& v : tiles_) {       if (v == 4) continue;       ScopedInc s(v);       ret.push_back(encode());     }     return ret;   }   private:   using Arr = array<unsigned char, 9>;   using It = Arr::iterator;    bool is_winning() {     // Pair     for (auto& v : tiles_) {       if (v < 2) continue;       ScopedInc s(v, -2);       if (is_winning_without_pair(/*num_groups=*/0, tiles_.begin())) return true;     }     return false;   }      bool is_winning_without_pair(int num_groups, It start) {     if (num_groups == 4) return true;     for (It i = start; i != tiles_.end(); ++i) {       // Identical group       if (*i >= 3) {         ScopedInc s(*i, -3);         if (is_winning_without_pair(num_groups + 1, i)) return true;       }       // Sequential group       if (tiles_.end() - i >= 3 && i[0] > 0 && i[1] > 0 && i[2] > 0) {         ScopedInc s0(i[0], -1), s1(i[1], -1), s2(i[2], -1);         if (is_winning_without_pair(num_groups + 1, i)) return true;       }     }     return false;   }    int encode() const {     int ret = 0;     for (auto v : tiles_ | views::reverse) {       ret = ret * 5 + v;     }     return ret;   }      Arr tiles_;   int num_tiles_; };  int main() {   constexpr int N = 5*5*5*5*5*5*5*5*5;   queue<int> q;   vector<int> failure_source(N);   for (int i = 0; i < N; i++) {     Hand hand(i);     if (hand.num_tiles() == 13 && !hand.is_waiting()) {       q.push(i);       failure_source[i] = i;     }   }   vector<bool> ok(N, true);   while (!q.empty()) {     Hand hand(q.front());     for (int successor : hand.get_successors()) {       if (ok[successor]) {         q.push(successor);         ok[successor] = false;         failure_source[successor] = failure_source[q.front()];       }     }     q.pop();   }   int best_hand_v = -1, max_tiles = 0;   for (int i = 0; i < N; i++) {     int num_tiles = Hand(i).num_tiles();     if (num_tiles < 13) continue;     if (ok[i] && num_tiles > max_tiles) {       best_hand_v = i;       max_tiles = num_tiles;     }   }   cout << "Best max tiles: " << max_tiles << endl;   map<int, int> counts;   for (int i = 0; i < N; i++) {     Hand hand(i);     int num_tiles = hand.num_tiles();     if (num_tiles < 13 || !ok[i]) continue;     ++counts[num_tiles];     if (num_tiles == max_tiles) {       hand.print();       cout << endl;     }   }   cout << "# of solutions by # of tiles: " << endl;   for (auto [num_tiles, count] : counts) {     cout << num_tiles << ": " << count << endl;   }      return 0; }      

user avatar

A(18)={333444455556666777}.

已手动枚举过是成立的。再增加一个3或者7,存在3333444466667的反例。再增加3个8,存在3345556677788的反例。

补充一下枚举过程:首先至少有1枚3和1枚7,否则转化为4种手牌的情况,已被火警证明过。为节省计算量,仅列出每种数牌的枚数以及其中1种听牌,如3444555566667记作13441,听3。

①1枚3+1枚7:

13441→1333,听3

14341→313,听5

②1枚3+2枚7:

12442→1342→232,听7

13342→2242→22,听7

13432→2332,听7

14242→1102,听2

14332→232,听7

14422→22,听7

③1枚3+3枚7:

11443→1111,听3

12343→124,听7

12433→124,听3

13243→214,听4

13333,听3

13423→232,听4

14233→142,听3

14323→3223,听5

14413→1111,听3

④2枚3+2枚7:

21442→21112:听7

22342→142,听5

22432→232,听7

23242→2002,听3

23332,听3

⑤2枚3+3枚7:

20443→2011,听4

21343→2101,听5

21433→214,听3

22243→2221,听3

22333,听3

22423→1102,听2

23143→2011,听4

23233,听3

23323,听3

23413→2011,听4

24043→2101,听5

24133→211,听3

24223→2122,听7

24313→2101,听5

24403→211,听3

⑥3枚3+3枚7:

30343→313,听4

30433→301,听4

31243→121,听5

31333,听4

31423→112,听3

32143→214,听4

32233,听4

32323,听4

32413→211,听4

33043→13,听5

33133,听5

枚举完毕,故X≥18.

user avatar

追更:

仍然先从结论来说:当集合A中包含四个连刻时,X =18。(刻子是三张相同的牌组成的面子,四连刻是指四个连续的刻子。例如:333444555666)

这里给出三个X=18的例子:A(18)={233334444555666777},{222333444455556666},{33344455556666777}。且他们平移或左右翻折后仍然可行。

具体求解过程用了递推和枚举遍历,由于过于复杂,就不做说明了。

原答案:

(题目经过一次修改,原题目为:麻将中同一花色的牌有 36 张,在 36 中选取一个整数值 x,13≤x≤36,那么这个整数 x 是否存在一个最大值 X,从 36 张一色牌中任意取出 X 张牌形成集合 A,使得手牌在门清状态下任意从 A 中选取 13 张手牌,都能形成一般形的清一色听牌,如果存在,这个最大值 X 是多少,请举出一个集合 A 的例子。)

从结论来说,不存在这样的X,使X满足题目中的条件。(后附问题修改建议)

1)证明:

首先找到一个13张牌的集合P,使P不听牌,不妨令P={1133445667799}。

假设,存在一个整数x [13,36],从36张牌中“任取”x张牌,使得这x张牌组成的集合A中的“任意”13张牌都是听牌。

既然是“任取”,那不妨令A P。

于是A中则有一种13张牌的组合P不是听牌,与假设矛盾。

故,不存在这样的x,使x满足题目中的条件。

2)问题修改建议:

麻将中同一花色的牌有 36 张,在 36 中选取一个整数值 x,13≤x≤36,那么这个整数 x 是否存在一个最大值 X,从 36 张一色牌中【存在一种】 X 张牌形成集合 A,使得手牌在门清状态下任意从 A 中选取 13 张手牌,都能形成一般形的清一色听牌,如果存在,这个最大值 X 是多少,请举出一个集合 A 的例子。

user avatar

抛砖引玉一下,盲猜 X = 16

A(16) = {3333444455556666}

分情况讨论如下:

A(无33) = {33444455556666} = {33, 444, 555, 666, 456} → 和牌

A(无44) = {33334455556666} = {333, 345, 456, 55, 666} → 和牌

A(无34) = {33344455556666} = {333, 44, 456, 555, 666} → 和牌

A(无35) = {33344445556666} = {333, 444, 456, 55, 666} → 和牌

A(无36) = {33344445555666} = {333, 444, 456, 555, 66} → 和牌

A(无45) = {33334445556666} = {333, 345, 456, 456, 66} → 和牌

因为所有包含于 A(16) 的 A(14) 都是和牌,所以任意包含于 A(16) 的 A(13) 都是听牌。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有