原题链接
https://vjudge.net/problem/Gym-270437J/origin
题意
基本思路
本题数据规模不大,
A
×
B
≤
100
A×B≤100
A×B≤100。也就是说最多100张牌。开始已经选好了2张,我们要再从中选3张,然后统计所有选法中每种牌型各有多少。穷举所有情况时间复杂度为1e6,是可行的。至于穷举方法,可以使用多重循环,也可以用dfs。
对于判断牌型,好的办法是先排序然后再判断。但是一定要注意存储五张扑克牌的数组,不要让排序影响了其他情况的穷举。
完整代码
#include<iostream>
#include<algorithm>
using namespace std;
int A, B, N;
struct Poker{
int a;
int b;
Poker(int a=0, int b=0)
{
this->a = a;
this->b = b;
}
bool operator == (const Poker &p)
{
return a == p.a;
}
bool operator != (const Poker &p)
{
return a != p.a;
}
};
bool cmp1(const Poker &x, const Poker &y)
{
return x.a<y.a;
}
int st[10];
Poker p[100];
Poker s[5];
Poker s0[5];
bool shunzi()
{
bool flag = true;
for(int i=0;i<4;i++) flag = flag && (s0[i].a+1==s0[i+1].a);
return flag;
}
bool tonghua()
{
bool flag = true;
for(int i=0;i<4;i++) flag = flag && (s0[i].b==s0[i+1].b);
return flag;
}
int elses()
{
if(s0[0] == s0[4]) return 4;
if(s0[0] != s0[1] && s0[1] == s0[4]) return 4;
else if(s0[3] != s0[4] && s0[0] == s0[3]) return 4;
else if(s0[0] == s0[1] && s0[2] == s0[4]) return 5;
else if(s0[0] == s0[2] && s0[3] == s0[4]) return 5;
else if(s0[0] == s0[1] && s0[2] == s0[3]) return 6;
else if(s0[0] == s0[1] && s0[3] == s0[4]) return 6;
else if(s0[1] == s0[2] && s0[3] == s0[4]) return 6;
else if(s0[0] == s0[1] && s0[1] == s0[2]) return 7;
else if(s0[1] == s0[2] && s0[2] == s0[3]) return 7;
else if(s0[2] == s0[3] && s0[3] == s0[4]) return 7;
else if(s0[0] == s0[1] || s0[1] == s0[2] || s0[2] == s0[3] || s0[3] == s0[4]) return 8;
else return 9;
return 0;
}
int judge()
{
for(int i=0;i<5;i++) {s0[i].a = s[i].a;s0[i].b = s[i].b;}
sort(s0, s0+5, cmp1);
bool st2 = shunzi();
bool st3 = tonghua();
if(st2 && st3) return 1;
else if(st2) return 2;
else if(st3) return 3;
else return elses();
return 0;
}
int main ()
{
cin>>A>>B;
cin>>s[0].a>>s[0].b;
cin>>s[1].a>>s[1].b;
int cnt=0;
for(int i=0;i<A;i++)
{
for(int j=0;j<B;j++)
{
if((i == s[0].a && j == s[0].b) || (i == s[1].a && j == s[1].b)) continue;
p[N++] = Poker(i, j);
}
}
for(int i=0;i<N;i++)
{
s[2].a = p[i].a; s[2].b = p[i].b;
for(int j=i+1;j<N;j++)
{
s[3].a = p[j].a; s[3].b = p[j].b;
for(int k=j+1;k<N;k++)
{
s[4].a = p[k].a; s[4].b = p[k].b;
st[judge()]++;
}
}
}
cout<<st[1];
for(int i=2;i<=9;i++) cout<<" "<<st[i];
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)