有 A × B 张扑克牌。每张扑克牌有一个大小(整数,记为a,范围区间是 0 到 A - 1)和一个花色(整数,记为b,范围区间是 0 到 B - 1。
有两张牌已知,求剩下的牌的不同组合,分别构成9种不同牌型的可能方案数。
重点在于给每个牌一个编号 number*B+color以方便进行遍历,AB的数据范围较小,通过三重for循环可以遍历剩余三张牌的的所有可能结果,然后依次判断属于哪种牌型。
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int number,color,index;//给每个牌一个编号 number*B+color
}card;
bool cmp(card a,card b){
return a.index<=b.index;
}
int A,B,n;//n为牌的总数
card c[6],a,b;
int ans[9];
int main(){
scanf("%d%d%d%d%d%d",&A,&B,&c[0].number,&c[0].color,&c[1].number,&c[1].color);
c[0].index=c[0].number*B+c[0].color;
c[1].index=c[1].number*B+c[1].color;
a=c[0];b=c[1];//否则之后排序后会丢失原有牌的信息
n=A*B;
//cout<<c[0].index<<" "<<c[1].index<<endl;
for(int i=0;i<9;i++) ans[i]=0;//初始化
for(int i=0;i<n-2;i++){
if(i==a.index||i==b.index) continue;
for(int j=i+1;j<n-1;j++){
if(j==a.index||j==b.index) continue;
for(int k=j+1;k<n;k++){
if(k==a.index||k==b.index) continue;
c[0]=a;c[1]=b;
c[2].index=i;c[2].color=i%B;c[2].number=i/B;
c[3].index=j;c[3].color=j%B;c[3].number=j/B;
c[4].index=k;c[4].color=k%B;c[4].number=k/B;
//for(int i=0;i<5;i++) cout<<c[i].index<<" ";//!!!!!
sort(c,c+5,cmp);
//cout<<endl;
//同花顺
if(c[0].color==c[1].color&&c[0].color==c[2].color&&c[0].color==c[3].color&&c[0].color==c[4].color&&c[0].number==c[1].number-1
&&c[1].number==c[2].number-1&&c[2].number==c[3].number-1&&c[3].number==c[4].number-1) ans[0]++;
//炸弹
else if((c[0].number==c[1].number&&c[1].number==c[2].number&&c[2].number==c[3].number)||
(c[1].number==c[2].number&&c[2].number==c[3].number&&c[3].number==c[4].number)) ans[1]++;
//三带二
else if((c[0].number==c[1].number&&c[1].number==c[2].number&&c[3].number==c[4].number)||(c[0].number==c[1].number&&c[2].number==c[3].number&&c[3].number==c[4].number)) ans[2]++;
//同花
else if(c[0].color==c[1].color&&c[0].color==c[2].color&&c[0].color==c[3].color&&c[0].color==c[4].color) ans[3]++;
//顺子
else if(c[0].number==c[1].number-1 &&c[1].number==c[2].number-1&&c[2].number==c[3].number-1&&c[3].number==c[4].number-1) ans[4]++;
//三条
else if((c[0].number==c[1].number&&c[1].number==c[2].number)||(c[1].number==c[2].number&&c[2].number==c[3].number)||(c[2].number==c[3].number&&c[3].number==c[4].number)) ans[5]++;
//两对
else if((c[0].number==c[1].number&&c[2].number==c[3].number)||(c[0].number==c[1].number&&c[4].number==c[3].number)||(c[1].number==c[2].number&&c[3].number==c[4].number)) ans[6]++;
//一对
else if(c[0].number==c[1].number||c[1].number==c[2].number||c[2].number==c[3].number||c[3].number==c[4].number) ans[7]++;
else ans[8]++;
}
}
}
for(int i=0;i<9;i++) printf("%d ",ans[i]);
}
需要注意的是,在排序之后会丢失原来已经选择的牌的信息,所以应该用两个变量把已经拥有的牌的信息保存下来,for循环中也应该在最里面的循环进行牌数组的赋值。