一.题目如下

二.题目分析

   麻将和牌有两种形式,即:
      模式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番
  1T1T, 2D2D,3T3T3T3T ,5D5D,6D6D6D6D.  巧7对+2“四归一”== 2+4番
  1T1T, 2D2D2D2D,3T3T3T3T , 6D6D6D6D.  巧7对+3“四归一”== 2+6番

模式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番
  1T1T,2D2D2D2D,5T5T5T,7D8D9D,1T2T3T.     1“四归一”+卡2条==2+1番

模式2中,全部或者部分连续三张同花色的一组牌如“2T3T4T或“7D8D9D”都可以被同花色的相同三张牌如“5T5T5T” 替代,如上。甚至是连续4张相同牌即“四归一”替代,如下,当然后者计算番数。

  1T1T,2D2D2D,5D5D5D5D,7D7D7D7D,5T6T7T.      2“四归一”==6番
  1T1T,2D2D2D2D,5D5D5D5D,7D7D7D7D,1T2T3T.    3“四归一”+卡2条==6+1番
  1T1T,2D2D2D2D,5D5D5D5D,7D7D7D7D,3T3T3T3T.  4“四归一”==8番

三.程序思路

输入:

最多18张牌,故最大存储空间为2*18+4','=40

遍历字符串:

       1)判断是否出现连续三种同花色牌(ka),如形如“4D5D6D”。在这种情况下,判断(ka2tiao)是否出现卡2条即“1T2T3T”。
       2) 判断(lian3)是否出现连续3张相同牌如“7T7T7T”
       3) 判断(gang)是否出现“四归一”并计数。

输出:

   1) 倘若连续三张同花色牌一组牌出现,或者连续三张相同牌的一组牌牌出现,或者“四归一”出现了4次,那么和牌是按照模式2和牌。
        番数=(是否出现“卡2条”)*1 + 2*“四归一”的次数
   2) 模式1即巧7对和牌
      番数=2+2*“四归一”的次数

四.程序代码

int main(int argc, _TCHAR* argv[])
{int fan=0;int i,j;int gang=0;bool ka=false,lian3=false,ka2tiao=false;char s[40]={'\0'};for(j=0;j<40;j++){cin>>s[j]; if(!((s[j]<='9'&&s[j]>='1')||s[j]=='D'||s[j]=='T'||s[j]==',')) break;}for(i=0;i<=(j-3);i++){if(s[i]<='9'&&s[i]>='1'&&s[i]==s[i+2]&&s[i+2]==s[i+4]&&s[i+4]==s[i+6]&&(s[i+8]==','||s[i+8]==s[j]))//判断是否有杠并计数,即四归一A如1D1D1D1Dgang+=1;if(s[i]<='9'&&s[i]>='1'&&(s[i]==s[0]||s[i-1]==',')&&s[i]==s[i+2]&&s[i+2]==s[i+4]&&(s[i+6]==','||s[i+6]==s[j]))//判断是否有连3,即如2D2D2Dlian3=1;if(s[i]<='9'&&s[i]>='1'&&(s[i]+2)==(s[i+2]+1)&&(s[i+2]+1)==(s[i+4])&&(s[i+6]==','||s[i+6]==s[j]))//判断是否有卡,即nT(n+1)T(n+2)T{ka=1;if(s[i]=='1'&&s[i+1]=='T')  ka2tiao=1;//判断卡2条-----1T2T3T 是否存在}}if(ka||lian3||gang==4)//存在nT(n+1)T(n+2)T或2D2D2D的或者4个“四归一”情况,必定是第2种和牌方式fan=ka2tiao*1+gang*2;elsefan=2+gang*2;//巧七对的和牌方式cout<<fan<<endl;return 0;
}

说明:由于遍历了字符串,因此每一局牌的任意一组牌的次序可以调换,并不影响输出结果。

转载于:https://www.cnblogs.com/engineerLF/p/5393147.html

2014华为机试,计算给定和牌麻将的番数相关推荐

  1. 2014华为机试西安地区A组试题

    2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...

  2. 华为机试 计算加减乘除数学表达式的结果

    源   代码链接http://codepad.org/s7KRVYiV #include <stdlib.h> #include <stdio.h> #include < ...

  3. 华为机试【连续出牌数量】

    标题:连续出牌数量 | 时间限制:1秒 | 内存限制:262144K | 语言限制: 不限 [连续出牌数量]有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红.黄.蓝.绿中的一种,数字为0-9中的 ...

  4. 华为机试——计算面积

    [计算面积] 绘图机器的绘图笔初始位i在原点(0.0). 机器启动后其绘图笔按下面规则绘制直线: 1 )尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E, 2 )期间可通过指令在纵坐标轴方向进行偏移 ...

  5. 华为机试:连续出牌数量

    [编程题目 |200分]连续出牌数量[2022 Q1,Q2考试题] 题目描述 手里给一副手牌,数字从0-9,有r(红色),,g(绿色),b(蓝色),y(黄色)四种颜色,出牌规则为每次打出的牌必须跟上一 ...

  6. 华为机试——计算字符个数

    题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 输入描述: 输入一个有字母和数字以及空格组成的字符串,和一个字符. ...

  7. 牛客网--华为机试在线训练2:计算字符个数

    牛客网–华为机试在线训练2:计算字符个数 题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 输入描述: 输入一个有字母 ...

  8. 【华为机试】HJ2 计算某字符出现次数

    [华为机试]HJ2 计算某字符出现次数 ## [华为机试]HJ2 计算某字符出现次数 ## [华为机试]HJ2 计算某字符出现次数 ## [华为机试]HJ2 计算某字符出现次数 ## [华为机试]HJ ...

  9. 《华为机试》——MP3光标位置 及 洗牌

    本期,我给大家带来以下两个题目的讲解: 1.<华为机试>--MP3光标位置 (中等) 2.  2017年校招真题--洗牌 (简单) 以上两个题的难度属于我也给大家标注出来了,接下来,我们一 ...

最新文章

  1. 关于MySQL索引知识与小妙招 — 学到了!
  2. 【一遍过!!!】1014 Waiting in Line (30 分)(题意+分析)
  3. ping不通win7、8解决方法以及nc后门的制作
  4. spring security:第一个程序解析
  5. 请解释python面向对象中的继承
  6. jq如何获取选中option的值_如何用jQuery获得select的值
  7. 敏捷测试感悟(之一)
  8. Wannafly挑战赛28A(模拟,题意文字游戏)
  9. vivado使用方法
  10. Mac 删除不必要的 Adobe PS AI 组件
  11. python爬大众点评手机号_python抓取大众点评商户信息
  12. C4D插件X-Particles粒子特效(六)
  13. NOIP 模拟题 国际跳棋
  14. 联通光纤猫hg8240路由功能开启
  15. Java程序员的搞笑段子
  16. Linux 命令 poll 和 ppoll 详解 + 实例
  17. Kotlin上的反应式流-SharedFlow和StateFlow
  18. 1、Python培训 Python 简介
  19. [leetcode] online judge题目汇总
  20. U3D插件 CSVSerialize(CSV转Scriptable)

热门文章

  1. 使用Bmob遇到的坑与解决办法
  2. 授权DNS之Cloudxns的体验
  3. 边缘计算架构、分层及典型组网拓扑
  4. SMM--Spring
  5. 初中使用计算机教学反思,初中信息技术课堂教学反思随笔
  6. Kylin的介绍及使用说明
  7. Discuz!创始人戴志康:关于命运、成长和目标
  8. 一些关于三角函数的公式
  9. machine learning : 最小二乘法之线性函数 --- python实现
  10. css3的半透明效果