掌握魔法の東東 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章