2022-09-20笔试题00
请注意,本文编写于 671 天前,最后修改于 671 天前,其中某些信息可能已经过时。

雀魂启动

题目描述

小包最近迷上了一款叫做雀魂的麻将游戏,但是这个游戏规则太复杂,小包玩了几个月了还是输多赢少。
于是生气的小包根据游戏简化了一下规则发明了一种新的麻将,只留下一种花色,并且去除了一些特殊和牌方式(例如七对子等),具体的规则如下:

总共有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 许可协议。转载请注明出处!