西电OJ - 1044***

题目链接:http://acm.xidian.edu.cn/problem.php?id=1044

 

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
/****************************************************************************************************************
                题意:打扑克中的扎金花(俗称飘三叶),给定三张牌,求大于该牌面的种类数
                思路;
                1,直接想到了暴力,只有九个面值,复杂度不高
                2,注意几点:
                    a,相同的点数只有四张,不存在 5 5 3 < 5 5 5这种牌面,在对子中应该考虑
                    b,注意顺子只有7个,而不是9个
                    c,在散排牌面中,注意不能是顺子,且(3 5 7和5 7 3)为一种情况,用一个访问数组标记
                    d,散排牌面的 2 3 5 比所有豹子大,要考虑到
                    e,wa了一下午的点,牌面为对子时,该对子牌面的豹子应该排除,即豹子数只有8,而非9
                3,细心写 if else,细心写for for for就OK了。
****************************************************************************************************************/
int visit[10][10][10];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int temp[3],f[3];
        memset(visit,0,sizeof(visit));
        for(int i = 0;i < 3;i ++)   cin>>temp[i];
        sort(temp,temp+3);

        int num=0;
        if(temp[0] == temp[1] && temp[1]== temp[2])
            num=9-temp[0]+1;
        else if(temp[0]+1 == temp[1] && temp[1]+1 == temp[2])
            num=9+9-temp[2];
        else if(temp[0] == temp[1]){
            num=(9-temp[0])*8+9-temp[2]+15;
            if(temp[2] < temp[1])   num-=1;
        }
        else if(temp[0] == temp[2]){
            num=(9-temp[0])*8+9-temp[1]+15;
            if(temp[1] < temp[0])   num-=1;
        }
        else if(temp[1] == temp[2]){
            num=(9-temp[1])*8+9-temp[0]+15;
            if(temp[0] < temp[1])   num-=1;
        }
        else{
                //cout<<"num1= "<<num<<endl;
            for(int i = 1;i <= 9;i ++){
                for(int j = 1;j <= 9;j ++){
                    for(int k = 1;k <= 9;k ++){
                        int flag=0;
                        f[0]=i;
                        f[1]=j;
                        f[2]=k;
                        sort(f,f+3);
                        if(visit[f[0]][f[1]][f[2]]) continue;
                        visit[f[0]][f[1]][f[2]]=1;
                        if(i != j && i != k && j != k){
                            //cout<<"i "<<i<<" j= "<<j<<" k= "<<k<<endl;
                            if(f[0]+1 == f[1] && f[1]+1 == f[2])    flag=1;
                            if(!flag){
                                if(f[2] > temp[2]) num++;
                                else if(f[2] == temp[2] && f[1] > temp[1])  num++;
                                else if(f[2] == temp[2] && f[1] == temp[1] && f[0] > temp[0])   num++;
                            }
                        }
                    }
                }
            }
            num+=88;
            if(temp[0] == 2 && temp[1] == 3 && temp[2] == 5)
                num-=9;
        }
        cout<<num<<endl;
    }
    return 0;
}


 

转载于:https://www.cnblogs.com/Jstyle-continue/p/6351995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值