斗地主

在斗地主扑克牌游戏中,扑克牌由小到大的顺序为3 4 5 6 7 8 9 10 J Q K A 2
玩家可以出的扑克牌阵型有,单张,对子,顺子,飞机,炸弹等
其中顺子的出牌规则为,由至少5张由小到大连续递增的扑克牌组成
且不能包含2
例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子
而{J,Q,K,A,2}、{2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子
给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子
如果存在多个顺子,请每行输出一个顺子
且需要按照顺子的第一张牌的大小(必须从小到大)依次输出
如果没有满足出牌规则的顺子,请输出No

输入描述
13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,
每张扑克牌的数字都是合法的
并且不包括大小王:2 9 J 2 3 4 K A 7 9 A 5 6
不需要考虑输入为异常字符的情况

输出描述
组成的顺子 每张扑克牌数字用空格隔开
3 4 5 6 7

示例一
输入
2 9 J 2 3 4 K A 7 9 A 5 6
输出
3 4 5 6 7
说明
13张牌中可以组成的顺子只有一组:3 4 5 6 7

示例二
输入
2 9 J 10 3 4 K A 7 Q A 5 6
输出
3 4 5 6 7
9 10 J Q K A
说明
13张牌中可以组成两组顺子,从小到大分别为:
3 4 5 6 7
9 10 J Q K A

示例三
输入
2 9 9 9 3 4 K A 10 Q A 5 6
输出
No
说明
13张牌中无法组成顺子

package main

import (
    "bufio"
    "fmt"
    "os"
    "sort"
    "strconv"
    "strings"
)

func main() {
    reader := bufio.NewScanner(os.Stdin)
    reader.Scan()
    temp := strings.Fields(reader.Text())
    arr := make([]int,0)
    for i := 0; i < len(temp); i++ {
        if temp[i] == "J" {
            arr = append(arr,11)
        } else if temp[i] == "Q" {
            arr = append(arr,12)
        } else if temp[i] == "K" {
            arr = append(arr,13)
        } else if temp[i] == "A" {
            arr = append(arr,14)
        } else {
            num, err := strconv.Atoi(temp[i])
            if err != nil {
                fmt.Println(err)
            }
            if num == 2 {
                continue
            }
            arr = append(arr,num)
        }
    }
    straight := make([][]int,0)
    sort.Ints(arr)
    used := make([]bool,len(arr))

    for i :=0; i <= len(arr)-5; i++ {
        if used[i] {
            continue
        }
        var count = 1
        var last = i
        s := []int{arr[i]}
        pos := []int{i}
        for j:= i+1; j < len(arr); j++ {
            if arr[j] == arr[last] || used[j] {
                continue
            }
            if arr[j]-arr[last] == 1 {
                s = append(s,arr[j])
                pos = append(pos,j)
                last=j
                count++
            } else {
                break
            }
        }
        if count >= 5{
            straight = append(straight,s)
            for _, v := range pos{
                used[v] = true
            }
        }
    }

    if len(straight) > 0 {
        for i :=0; i < len(straight); i++ {
            for j := 0; j < len(straight[i]); j++ {
                if j == len(straight[i])-1 {
                    if straight[i][j] == 11 {
                        fmt.Printf("J\n")
                    } else if straight[i][j] == 12 {
                        fmt.Printf("Q\n")
                    } else if straight[i][j] == 13 {
                        fmt.Printf("K\n")
                    } else if straight[i][j] == 14 {
                        fmt.Printf("A\n")
                    } else {
                        fmt.Printf("%d\n",straight[i][j])
                    }
                } else {
                    if straight[i][j] == 11 {
                        fmt.Printf("J ")
                    } else if straight[i][j] == 12 {
                        fmt.Printf("Q ")
                    } else if straight[i][j] == 13 {
                        fmt.Printf("K ")
                    } else if straight[i][j] == 14 {
                        fmt.Printf("A ")
                    } else {
                        fmt.Printf("%d ",straight[i][j])
                    }
                }
            }
        }
    } else {
        fmt.Println("No")
    }
}

你可能感兴趣的:(斗地主)