XidianOJ 1044 炸金花

Posted TOTOTOTOTZZZZZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XidianOJ 1044 炸金花相关的知识,希望对你有一定的参考价值。

题目描述

炸金花是一个风靡全球的扑克游戏,不少人因为这个游戏发了家,而更多的人则输得倾家荡产。为了帮助赌徒们戒掉它,现在决定派你去写一个程序,帮助赌徒们更好的认识这个游戏。

炸金花在这里被简化成这样一个情况:每一个人都会得到随机派发的三张牌(每张牌的点数为整数区间[1,9]中的某个数,点数相同的牌最多只有4张),然后比较大小。

比较大小的方式是这样的:

① 豹子:即三张点数一样的牌,若双方都为豹子,则点数大者为大,豹子大于任何其他情况;

② 顺子:即三张点数连续递增的牌,比如(4,5,6),(1,2,3),若双方都是顺子,点数大者为大,顺子大于对子和单张;

③ 对子:即两张点数一样的牌带一张单牌,比如(1,1,4),(2,2,5),若双方都是对子,则成对的牌点数大者为大,如果那一对也一样,则比较单张的大小,对子大于单张;

④ 单张:即三张牌不是上述的三种。单张的比较大小方式是,先比较点数最大的,再比较点数第二大的,再比较点数第三大的。

需要注意的是一个特殊情况,那就是,2,3,5比大部分牌都小,但是比豹子大。

你的任务是,对于对手的给定的一种情况,告诉赌徒,有多少种情况可以赢对方。(4,5,6及5,4,6这样算一种情况)

 

输入

有多组输入数据,第一行为一个数字T,代表有T组输入数据 (0<T≤1000)。

接下来为T组数据,每组数据占一行,为3个整数,表示对手的拿牌情况。

 

输出

对于每组数据,在一行上输出一个整数,表示赢得对手的情况数。

--正文

直接一种种情况考虑过去就好

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

int card[4];
int danzhang[10] = {0,0,0,0,2,5,9,14,20,27};
long long ans = 0;

bool cmp(int a,int b){
    return (a <= b);
}

void Solve(){
    ans = 0;
    sort(card+1,card+4,cmp);
    if (card[1] == card[2]) {
        if (card[2] == card[3]){ // baozi
            ans = (9 - card[1]) + 1;
        }
        else { //duizi
            int tmp1 = (9-card[3]) + 8*(9-card[1]); // duizi bi ta da
            int tmp2 = 7; // shunzi
            int tmp3 = 8; // baozi 
            ans = tmp1 + tmp2 + tmp3;
        }
    }    
    else {
        if (card[2] == card[3]){ //duizi
            int tmp1 = (9-card[1]) + 8*(9-card[3]); // tongshang
            int tmp2 = 7;
            int tmp3 = 8;
            ans = tmp1 + tmp2 + tmp3;
        }     
        else {
            if (card[2] == card[1] + 1 && card[3] == card[2] + 1){ //shunzi
                int tmp1 = 7 - card[1]; // shunzi
                int tmp2 = 9;
                ans = tmp1 + tmp2;
            }
            else { //danzhang
                int tmp1 = 0,i;
                if (card[2] == card[3] - 1){
                    tmp1 = card[2] - card[1] - 2;
                }
                else
                    tmp1 = card[2] - card[1] - 1;
                for (i=card[2]+1;i<card[3]-1;i++){
                    tmp1 += i - 1;    
                }
                if (card[2] < card[3] - 1)
                    tmp1 += card[3] - 3;
                for (i=card[3]+1;i<=9;i++){
                    tmp1 += danzhang[i];
                }
                int tmp2 = 72 ; // duizi
                int tmp3 = 7; // shunzi
                int tmp4 = 9; // baozi
                ans = tmp1 + tmp2 + tmp3 + tmp4;
            }
        }
    }
}

int main(){
    int time,T;
    scanf("%d",&T);
    
    for (time=1;time<=T;time++){
        scanf("%d %d %d",&card[1],&card[2],&card[3]);
        //printf("%d %d %d",card[0],card[1],card[2]);
        Solve();
        printf("%lld\n",ans);
    }
    
    return 0;
} 

 

以上是关于XidianOJ 1044 炸金花的主要内容,如果未能解决你的问题,请参考以下文章

Java版炸金花

Java版炸金花

微信约战炸金花棋牌平台出租Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例

棋牌平台制作教程之php中的炸金花大小比较算法

微信炸金花源码搭建

用 Python 和微信炸金花搭建的距离