- 斗地主
- 2018-08-17 15:13:00 @
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
int T,n;
int cnt[17],ans=99;
const int size[4]={0,5,3,2};
void dfs(int x)
{
if(x>ans) return;
for(int i=3;i;i--)//处理顺子,i是顺子中相同牌的个数
{
int l=0;
for(int j=3;j<=14;j++)
{
if(cnt[j]>=i) l++;else l=0;
if(l>=size[i])
{
for(int k=j-l+1;k<=j;k++) cnt[k]-=i;
dfs(x+1);
for(int k=j-l+1;k<=j;k++) cnt[k]+=i;
}
}
}
for(int i=2;i<=14;i++)//处理4带2,注意处理4带两对
{
if(cnt[i]>=4)
{
cnt[i]-=4;
for(int j=2;j<=14;j++)
{
if(i==j||cnt[j]<2) continue;
cnt[j]-=2;
for(int k=2;k<=14;k++)
{
if(cnt[k]<2||k==j) continue;
cnt[k]-=2;dfs(x+1);cnt[k]+=2;
}
cnt[j]+=2;
}
for(int j=2;j<=15;j++)
{
if(i==j||cnt[j]<1) continue;
--cnt[j];
for(int k=2;k<=15;k++)
{
if(cnt[k]<1||k==j) continue;
--cnt[k];dfs(x+1);++cnt[k];
}
++cnt[j];
}
cnt[i]+=4;
}
}
for(int i=2;i<=14;i++)//处理3带(1\2)
{
if(cnt[i]>=3)//3带2
{
cnt[i]-=3;
for(int j=2;j<=14;j++)
{
if(cnt[j]<2||i==j) continue;
cnt[j]-=2;
dfs(x+1);
cnt[j]+=2;
}
for(int j=2;j<=15;j++)//3带1
{
if(cnt[j]<1||i==j) continue;
--cnt[j];dfs(x+1);++cnt[j];
}
cnt[i]+=3;
}
}
for(int i=2;i<=15;i++) if(cnt[i]>0) ++x;//剩下的牌只能每种相同的牌单独出,每种牌只用出一次
ans=min(ans,x);
}
int main()
{
T=read(),n=read();
while(T--)
{
memset(cnt,0,sizeof(cnt));
ans=99;
for(int i=1;i<=n;i++){int x=read();if(x!=0)cnt[x]++;else cnt[15]++;x=read();}
cnt[14]=cnt[1];dfs(0);printf("%d\n",ans);
}
return 0;
}楼上楼下的多看看
0 条评论
信息
- ID
- 1980
- 难度
- 8
- 分类
- (无)
- 标签
- 递交数
- 2591
- 已通过
- 352
- 通过率
- 14%
- 被复制
- 12
- 上传者