Golang实现七星不靠中国麻将能否胡牌算法

题目来源网易互娱2021笔试题

七星不靠是中国麻将竞赛规则的番种,胡牌时由东南西北中发白7张,外加其他花色的147、258、369不相连的牌型,且没有将牌而组成。

七星不靠中的七星是指:东西南北中发白,也就是牌中必须有这七张。而其它牌按下述的来拼全:

东西南北中发白+147万+258饼+369条
东西南北中发白+147万+258条+369饼
东西南北中发白+147条+258万+369饼
东西南北中发白+147条+258饼+369万
东西南北中发白+147饼+258条+369万
东西南北中发白+147饼+258万+369条

由于胡牌时只需要14张牌,而上述组合均有16张,那么除了东西南北中发白必须有外,其它三色可以随便去掉两张,都可以组成七星不靠。

我们的任务是,假设我们的14张牌中已经包含了东西南北中发白这7张牌,另外的牌都是万饼条的序数牌,给出另外的这7张牌,判断是否能组成七星不靠。

基本解决思路为:
1,获得输入,固定为7张,因此建立长度为7的string数组
2,建立3个map[int]bool方便查找,也可以建立长度为10 [10]bool的数组,
对每一个数组里的元素进行判断,根据第二位分成不同的类别,将数字大小分别存进去
3,对3个map遍历,如果map里的数字,+1,+2,-1,-2也存在map里,即输出NO,进入下一组数据;
4,特别的,如果三个map的长度加起来不等于7,说明有重复的字牌,可以直接输入NO,进入下一组数据。
另外,是在for循环里,遍历map,如果退出循环应该使用continue flag。

package main
import "fmt"
import "strconv"
func main(){
    n:=0
    fmt.Scan(&n)
    data:=[7]string{}
    flag:
    for ;n>0;n--{
        for i:=0;i<7;i++{
            fmt.Scan(&data[i])
        }
        t,b,w:=map[int]bool{},map[int]bool{},map[int]bool{}
        for i:=range data{
            num,_:=strconv.Atoi(string(data[i][0]))
            if data[i][1]=='B'{
                b[num]=true
            }else if data[i][1]=='W'{
               w[num]=true
            }else if data[i][1]=='T'{
                t[num]=true
            }
        }
        if len(t)+len(w)+len(b)!=7{
            fmt.Println("NO")
            continue flag
        }
        for v:=range t{
            if t[v-1]||t[v-2]||t[v+1]||t[v+2]{
            fmt.Println("NO")
            continue flag
            }
        }
             for v:=range w{
            if w[v-1]||w[v-2]||w[v+1]||w[v+2]{
            fmt.Println("NO")
            continue flag
            }
        }
                for v:=range b{
            if b[v-1]||b[v-2]||b[v+1]||b[v+2]{
            fmt.Println("NO")
            continue flag
            }
        }
       fmt.Println("YES")
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSY_HELLOWORLD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值