题目链接:点击这里
解题思路
对于不懂麻将的我来说,此题花了不少时间去揣摩题意。不过其实题目简化了规则:手上有13张牌,要摸一张胡牌,叫你求摸哪一张可以胡牌。由于整副牌只能拆成一个将(两张相同的牌),不限数量个刻子或顺子。因此,我们可以想象,任意摸一张牌后,除去将,还有12张牌,正好分为4组(3张为一组)刻子或顺子。
因此,此题首先应该是遍历所有可能摸到的牌,然后检查当前牌是否可能胡牌。检查的方式应该为先找将(有两张以上的牌都可能),然后递归找顺子和刻子。
技巧及注意事项
- 此题思路比较容易,但第一步是要把所有的字符串转换为便于处理和表达的字符。因此本文直接将其转换为了ID。
- 寻找顺子时,从顺子的最小值开始取,因此最大顺子为7W8W9W,并且注意在连续的T和S和W之间是不能形成顺子的。
- 回溯法要注意每次进行递归尝试后,要将减去的数量重新加上。
- 注意在主函数中,若找到和牌,number中的数量会变为0,因此需要额外数组进行还原。
- 在添加第14张牌时,若手牌种相同的牌已经有4张,则不可能再添加。
代码示例:
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
const string mahjong[] =
{
"1T","2T","3T","4T","5T","6T","7T","8T","9T",
"1S","2S","3S","4S",