2025年L1-8 雀魂majsoul (20 分)

L1-8 雀魂majsoul (20 分)大家都知道雀魂 majsoul 是一个麻将游戏 ln 的麻将功底相当高 魂天 dalao 今天有个小学妹问他麻将怎么打才能胡大牌 但是因为 ln 还要上国服第一 懒的回她 所以他把问题抛给了你 很简单 你只要判断题目给出的牌型能不能胡特定的牌型即可 1 九莲宝灯只有一种类型的牌 条 饼 万

大家好,我是讯享网,很高兴认识大家。

大家都知道雀魂majsoul是一个麻将游戏
ln的麻将功底相当高(魂天dalao),今天有个小学妹问他麻将怎么打才能胡大牌
但是因为ln还要上国服第一,懒的回她
所以他把问题抛给了你
很简单,你只要判断题目给出的牌型能不能胡特定的牌型即可
1.九莲宝灯只有一种类型的牌(条、饼、万)其中19各三张其他1张再加任何一张当前种类的牌即可
2.七对子(七个不同的对子)
3.国士无双需要条、饼(筒)、万的幺九牌(1和9共计6张)+所有的风牌(东西南北白发中7张)+前面的牌任意一张
当然,有时候出千不可避免,所以你需要判断这副牌是否合法(每种牌只有四张)
条 筒 万每种牌从1-9及w1 w2 w3 - w7 w8 w9每张牌有四张相同的,风牌及东西南北白发中,也是有4张相同的。共计136张牌。

输入格式:

第一行包含一个n,接着n行每行一个字符串。
如果当前字符为t,b,w 那么他们分别代表着条,饼(筒),万。他们后面会紧接着一个数字,例如,t2代表2筒,w3代表三万。
如果当前字符为zxcvjkl其中一个,那么他们直接代表风牌中的一个。

输出格式:

对于每个字符串判断牌型:
1七对子:“qidui”
2九莲宝灯:“jiulianbaodeng!”
3国士无双:“32000!”
4如果都不符合,则输出“zhahu”


讯享网

输入样例:

输出样例:

32000!

思路

对于每一行,我们用四个数组分别存储条、饼(筒)、万、风牌的每种牌的个数。紧接着判断该牌是否合法,最后依次对三种胡牌的条件进行判断即可。

代码

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N = 12; int n; string str; string ch = "zxcvjkl"; int t[N] , b[N] , w[N]; // 存储条、饼、万 int c[N]; // 存储风牌,依次表示 东西南北白发中 bool init() { 
    int cnt = 0; for(int i = 0 ; i < str.size() ; i++) { 
    if(ch.find(str[i]) != -1) { 
    if(++c[ch.find(str[i]) + 1] > 4) return false; } else { 
    if(i + 1 >= str.size()) return false; if(str[i] == 't') { 
    if(++t[str[i + 1] - '0'] > 4) return false; } else if(str[i] == 'b') { 
    if(++b[str[i + 1] - '0'] > 4) return false; } else if(str[i] == 'w') { 
    if(++w[str[i + 1] - '0'] > 4) return false; } else return false; i++; } cnt++; } return cnt == 14; // 判断这手牌是否合法 } // x[i]表示xi的个数,例如t[2]表示二条的个数; // 只要x[i]=2,那么就说明我xi只有两张,就是一个对子,那么+1 int cntDui(int x[]) { 
    int cnt = 0; for(int i = 1 ; i < 10 ; i++) cnt += x[i] == 2; return cnt; } // 七对子(七个不同的对子) bool qidui() { 
    //cout<<"cntDui(t)"<<cntDui(t)<<endl; if(cntDui(t) + cntDui(b) + cntDui(w) + cntDui(c) == 7) { 
    cout<<"qidui"<<endl; return true; } return false; } // 1. 判断x类型的牌是否每种牌都有,如果没有直接返回false // 2. 因为题目要求1、9各三张,那么就应当是 // (1->3, 2->1, 3->1, 4->1, 5->1, 6->1, 7->1, 8->1, 9->3) + ((1~9)->1) // 总共13 + 1 = 14张 int judge(int x[]) { 
    int cnt = 0; for(int i = 1 ; i < 10 ; i++) { 
    cnt += x[i]; if(x[i] == 0) return false; } return cnt == 14; } // 九莲宝灯只有一种类型的牌(条、饼、万)其中1、9各三张其他1张再加任何一张当前种类的牌即可  bool jiulian() { 
    if((judge(t) && t[1] >= 3 && t[9] >= 3) || (judge(w) && w[1] >= 3 && w[9] >= 3) || (judge(b) && b[1] >= 3 && b[9] >= 3)) { 
    cout<<"jiulianbaodeng!"<<endl; return true; } return false; } // 判断每种风牌是否都有,因为一种风牌只有一张,所以只需要反判某种风牌不存在就false bool judgeCh() { 
    for(int i = 1 ; i <= ch.size() ; i++) { 
    if(c[i] == 0) return false; } return true; } // 判断种类为x、从2到9是否存在,如果存在就不符合 前面的牌任意一张,因为出现了不是【前面的牌】 bool isEmity(int x[]) { 
    for(int i = 2 ; i < 9 ; i++) if(x[i]) return false; return true; } // 国士无双需要条、饼(筒)、万的幺九牌(1和9共计6张)+所有的风牌(东西南北白发中7张)+前面的牌任意一张  bool guoshi() { 
    if(t[1] && t[9] && w[1] && w[9] && b[1] && b[9] && judgeCh() && isEmity(t) && isEmity(w) && isEmity(b)) { 
    cout<<"32000!"<<endl; return true; } return false; } int main() { 
    cin>>n; while(n--) { 
    cin>>str; if(!init() || (!qidui() && !jiulian() && !guoshi())) cout<<"zhahu"<<endl; } return 0; } 

讯享网
小讯
上一篇 2025-01-17 13:27
下一篇 2025-03-27 19:08

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/11592.html