小包最近迷上了一款叫做雀魂的麻将游戏,但是这个游戏规则太复杂,小包玩了几个月了还是输多赢少。 于是生气的小包根据游戏简化了一下规则发明了一种新的麻将,只留下一种花色,并且去除了一些特殊和牌方式(例如七对子等),具体的规则如下: 总共有36张牌,每张牌是1~9。每个数字4张牌。 你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌 14张牌中有2张相同数字的牌,称为雀头。 除去上述2张牌,剩下12张牌可以组成4个顺子或刻子。顺子的意思是递增的连续3个数字牌(例如234,567等),刻子的意思是相同数字的3个数字牌(例如111,777) 例如: 1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以组成1,2,6,7的4个刻子和9的雀头,可以和牌 1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀头,组123,123,567,789的四个顺子,可以和牌 1 1 1 2 2 2 3 3 3 5 6 7 7 9 无论用1 2 3 7哪个做雀头,都无法组成和牌的条件。 现在,小包从36张牌中抽取了13张牌,他想知道在剩下的23张牌中,再取一张牌,取到哪几种数字牌可以和牌。 输入描述: 输入只有一行,包含13个数字,用空格分隔,每个数字在1~9之间,数据保证同种数字最多出现4次。 输出描述: 输出同样是一行,包含1个或以上的数字。代表他再取到哪些牌可以和牌。若满足条件的有多种牌,请按从小到大的顺序输出。若没有满足条件的牌,请输出一个数字0 示例1 输入 1 1 1 2 2 2 5 5 5 6 6 6 9 输出 9 说明 可以组成1,2,6,7的4个刻子和9的雀头 示例2 输入 1 1 1 1 2 2 3 3 5 6 7 8 9 输出 4 7 说明 用1做雀头,组123,123,567或456,789的四个顺子 示例3 输入 1 1 1 2 2 2 3 3 3 5 7 7 9 输出 0 说明 来任何牌都无法和牌 备注: 请不要根据自己的常识为题目增加未提及的条件 对于20%的数据,保证和牌时一定是4个刻子+雀头的形式
let arr = readline().split(' ').map(Number); let account = Array(9).fill(0); arr.forEach(e=>account[e-1]++); let arrRemain = account.map(e => 4-e); // 记录剩余牌的次数 let ishu = (nums) => { let len = nums.length; if (len === 0)return true; let count = 0; nums.forEach(e => e === nums[0] && count++) // nums最前面的数字至少2个相同,将2个数字作为雀头;递归判断剩下的数字 if (count>=2 && len%3!==0 && ishu(nums.slice(2))) return true; // nums最前面的数字至少三个相同,将3个数字作为刻子;递归判断剩下的数字 if(count>=3 && ishu(nums.slice(3))) return true; // nums最前面的数字只出现了1次,在nums数组里找到比这个数字大1和大2的数字组成顺子;递归判断剩余的数字 let [n, m] = [nums[0] + 1, nums[0] + 2]; if (nums.indexOf(n) !== -1 && nums.indexOf(m) !== -1) { // 去掉这个顺子 nums.splice(0, 1); // 去掉顺子的第1个数字 nums.splice(nums.indexOf(n), 1); // 去掉顺子的第2个数字 nums.splice(nums.indexOf(m), 1); // 去掉顺子的第3个数字 return ishu(nums); } return false; } let res = []; for(let i=1; i<=9; i++) { let nums = arr.slice(); if (arrRemain[i-1] <=0) continue; // 剩余的牌中没有这个数字 nums.push(i) nums.sort((a, b) => a - b); ishu(nums) && res.push(i); } res.length > 0 ? console.log(res.join(' ')) : console.log(0);
本文作者:前端小毛
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!