掌握魔法の东东 II(模拟)

问题描述

\hspace{17pt}从瑞神家打牌回来后,东东痛定思痛,决定苦练牌技,终成赌神!
\hspace{17pt}东东有 A × B 张扑克牌。每张扑克牌有一个大小(整数,记为a,范围区间是 0 到 A - 1)和一个花色(整数,记为b,范围区间是 0 到 B - 1。
\hspace{17pt}扑克牌是互异的,也就是独一无二的,也就是说没有两张牌大小和花色都相同。
\hspace{17pt}“一手牌”的意思是你手里有5张不同的牌,这 5 张牌没有谁在前谁在后的顺序之分,它们可以形成一个牌型。 我们定义了 9 种牌型,如下是 9 种牌型的规则,我们用“低序号优先”来匹配牌型,即这“一手牌”从上到下满足的第一个牌型规则就是它的“牌型编号”(一个整数,属于1到9):

\hspace{17pt}同花顺: 同时满足规则 5 和规则 4.
\hspace{17pt}炸弹 : 5张牌其中有4张牌的大小相等.
\hspace{17pt}三带二 : 5张牌其中有3张牌的大小相等,且另外2张牌的大小也相等.
\hspace{17pt}同花 : 5张牌都是相同花色的.
\hspace{17pt}顺子 : 5张牌的大小形如 x, x + 1, x + 2, x + 3, x + 4
\hspace{17pt}三条: 5张牌其中有3张牌的大小相等.
\hspace{17pt}两对: 5张牌其中有2张牌的大小相等,且另外3张牌中2张牌的大小相等.
\hspace{17pt}一对: 5张牌其中有2张牌的大小相等.
\hspace{17pt}要不起: 这手牌不满足上述的牌型中任意一个.

\hspace{17pt}现在, 东东从A × B 张扑克牌中拿走了 2 张牌!分别是 (a1, b1) 和 (a2, b2). (其中a表示大小,b表示花色)
\hspace{17pt}现在要从剩下的扑克牌中再随机拿出 3 张!组成一手牌!!
\hspace{17pt}其实东东除了会打代码,他业余还是一个魔法师,现在他要预言他的未来的可能性,即他将拿到的“一手牌”的可能性,我们用一个“牌型编号(一个整数,属于1到9)”来表示这手牌的牌型,那么他的未来有 9 种可能,但每种可能的方案数不一样。
\hspace{17pt}现在,东东的阿戈摩托之眼没了,你需要帮他算一算 9 种牌型中,每种牌型的方案数。

Input

第 1 行包含了整数 A 和 B (5 ≤ A ≤ 25, 1 ≤ B ≤ 4).

第 2 行包含了整数 a1, b1, a2, b2 (0 ≤ a1, a2 ≤ A - 1, 0 ≤ b1, b2 ≤ B - 1, (a1, b1) ≠ (a2, b2)).

Output

输出一行,这行有 9 个整数,每个整数代表了 9 种牌型的方案数(按牌型编号从小到大的顺序)

Sample input & output

Sample input1
5 2
1 0 3 1
Sample output1
0 0 0 0 8 0 12 36 0
Sample input2
25 4
0 0 24 3
Sample output2
0 2 18 0 0 644 1656 36432 113344

解题思路

看这道题的数据范围就知道暴力模拟题,直接枚举所有的牌,然后按照顺序判断满足哪一种情况即可。

枚举的时候注意判断,防止牌重复。最终结果还要除以6,因为我们只判断了是否重复,没有判断枚举的后三张牌的顺序,所以要除以A33A_{3}^{3}

一个小窍门就是可以先将大小和花色排序,排序后各种情况在判断的时候就会简化许多。

完整代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

int A,B,a1,b1,a2,b2,ru[10],a[6],b[6];
bool rule4()
{
    if(b[1]==b[5]) return true;
    return false;
}
bool rule5()
{
    for (int i=2; i<=5; i++)
        if(a[i]-a[i-1]!=1)
            return false;
    return true;
}
bool rule1()
{
    if(rule4() && rule5()) return true;
    return false;
}
bool rule2()
{
    if(a[1]==a[2] && a[2]==a[3] && a[3]==a[4]) return true;
    else if(a[2]==a[3] && a[3]==a[4] && a[4]==a[5]) return true;
    return false;
}
bool rule3()
{
    if(a[1]==a[2] && a[2]==a[3] && a[4]==a[5]) return true;
    else if(a[3]==a[4] && a[4]==a[5] && a[1]==a[2]) return true;
    return false;
}
bool rule6()
{
    if(a[1]==a[2] && a[2]==a[3]) return true;
    else if(a[2]==a[3] && a[3]==a[4]) return true;
    else if(a[3]==a[4] && a[4]==a[5]) return true;
    return false;
}
bool rule7()
{
    if(a[1]==a[2] && a[3]==a[4]) return true;
    else if(a[1]==a[2] && a[4]==a[5]) return true;
    else if(a[2]==a[3] && a[4]==a[5]) return true;
    return false;

}
bool rule8()
{
    if(a[1]==a[2] || a[2]==a[3] || a[3]==a[4] || a[4]==a[5]) return true;
    return false;

}
void rule(int a3,int b3,int a4,int b4,int a5,int b5)
{
    a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5;
    b[1]=b1; b[2]=b2; b[3]=b3; b[4]=b4; b[5]=b5;
    sort(a+1,a+5+1); sort(b+1,b+5+1);
    if(rule1()) ru[1]++;
    else if(rule2()) ru[2]++;
    else if(rule3()) ru[3]++;
    else if(rule4()) ru[4]++;
    else if(rule5()) ru[5]++;
    else if(rule6()) ru[6]++;
    else if(rule7()) ru[7]++;
    else if(rule8()) ru[8]++;
    else ru[9]++;
}
int main()
{
    scanf("%d %d %d %d %d %d",&A,&B,&a1,&b1,&a2,&b2);
    for (int i=0; i<A; i++)
        for (int i2=0; i2<B; i2++)
            if(!(i==a1 && i2==b1) && !(i==a2 && i2==b2))
                for (int j=0; j<A; j++)
                    for (int j2=0; j2<B; j2++)
                        if(!(j==a1 && j2==b1) && !(j==a2 && j2==b2) && !(j==i && j2==i2))
                            for (int k=0; k<A; k++)
                                for (int k2=0; k2<B; k2++)
                                    if(!(k==a1 && k2==b1) && !(k==a2 && k2==b2) && !(k==j && k2==j2) && !(k==i && k2==i2))
                                        rule(i,i2,j,j2,k,k2);
    for (int i=1; i<=9; i++)
        printf("%d ",ru[i]/6);
    putchar('\n');
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章