掌握魔法的东东二
题干
思路
分析题意,不难理解,就是从A✖B张牌里拿五张牌出来,求各种不同牌型的数量。
我开始的思路是利用排列组合,把这些牌先按照数字和花色的大小顺序排好(像一个矩阵),然后在固定选取两张牌的情况下,在剩下的牌里选取三张牌。在我自信满满地用CAn编好一套规则之后,Wrong Answer给了我当头一棒,好吧,听说暴力法不会超时(数据限额),那就用暴力法吧。
暴力法就是用两个数组分别存储五张牌的信息,将所有的牌存到一个结构体数组里,在排除掉固定的两张牌之后,遍历不放回地抽取三张牌,放入存储信息的数组,再对两个数组的信息进行判断(按照牌型的优先级判断,高级挑剩下为低级型)得到合适的牌型认定,更新对应牌型数目。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int A,B,n;//数字数和花色数,除去两张牌之后的牌数
int a1,a2,b1,b2;//开始两张牌数字和花色
int ji[9];//记录每种牌型的数量
int shu[5],hua[5];//分别存储五张牌的数字和花色 ,用于判断类型
struct pork{
int a,b;//单张牌的数字与花色
}porks[110];
void chushi()
{
//shu[0]=a1;
//shu[1]=a2;
//hua[0]=b1;
//hua[1]=b2;
for(int i=0;i<9;i++)
{
ji[i]=0;
}
}
void jishu()
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
for(int k=j+1;k<n;k++)
{
shu[0]=a1;shu[1]=a2;
hua[0]=b1;hua[1]=b2;
shu[2]=porks[i].a;hua[2]=porks[i].b;
shu[3]=porks[j].a;hua[3]=porks[j].b;
shu[4]=porks[k].a;hua[4]=porks[k].b;
sort(shu,shu+5);
if(hua[0]==hua[1]&&hua[0]==hua[2]&&hua[0]==hua[3]&&hua[0]==hua[4])
{
if(shu[1]==shu[0]+1&&shu[2]==shu[1]+1&&shu[3]==shu[2]+1&&shu[4]==shu[3]+1)
ji[0]++;//tonghuashun
else
ji[2]++;//tonghua
}
else if(shu[1]==shu[0]+1&&shu[2]==shu[1]+1&&shu[3]==shu[2]+1&&shu[4]==shu[3]+1)
ji[1]++;//shunzi
else if(shu[0]==shu[1]&&shu[1]==shu[2]&&shu[2]==shu[3]||shu[1]==shu[2]&&shu[2]==shu[3]&&shu[3]==shu[4])
ji[3]++;//boom
else if(shu[0]==shu[1]&&shu[1]==shu[2]&&shu[4]==shu[3]||shu[1]==shu[0]&&shu[2]==shu[3]&&shu[3]==shu[4])
ji[4]++;//san er
else if(shu[0]==shu[1]&&shu[2]==shu[3]||shu[0]==shu[1]&&shu[3]==shu[4]||shu[1]==shu[2]&&shu[3]==shu[4])
ji[5]++;//liangdui
else if(shu[0]==shu[1]&&shu[1]==shu[2]||shu[1]==shu[2]&&shu[2]==shu[3]||shu[2]==shu[3]&&shu[3]==shu[4])
ji[6]++;//san
else if(shu[0]==shu[1]||shu[1]==shu[2]||shu[2]==shu[3]||shu[3]==shu[4])
ji[7]++;//yidui
else
ji[8]++;
}
}
}
}
int main()
{
scanf("%d%d",&A,&B);
n=0;
scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
chushi();
for(int i=0;i<A;i++)
{
for(int j=0;j<B;j++)
{
if((i==a1&&j==b1)||(i==a2&&j==b2))
continue;
porks[n].a=i;
porks[n].b=j;
n++;
}
}
jishu();
for(int i=0;i<9;i++)
{
printf("%d ",ji[i]);
}
return 0;
}