斗地主 加强版86分求调
查看原帖
斗地主 加强版86分求调
1285691
yinbe2楼主2024/2/25 12:19
#include<iostream>
#include<cstring>
using namespace std;
int T,n,sum[20],Min;
void dfs(int t)
{
	if(t>=Min)return;
	int k=0;
	for(int i=3;i<=14;i++)//单顺子 
	{
		if(sum[i]==0)k=0;
		else
		{
			k++;
			if(k>=5)
			{
				for(int j=i;j>=i-k+1;j--)sum[j]--;
				dfs(t+1);
				for(int j=i;j>=i-k+1;j--)sum[j]++;
			}
		}
	}
	k=0;
	for(int i=3;i<=14;i++)//双顺子 
	{
		if(sum[i]<=1)k=0;
		else
		{
			k++;
			if(k>=3)
			{
				for(int j=i;j>=i-k+1;j--)sum[j]-=2;
				dfs(t+1);
				for(int j=i;j>=i-k+1;j--)sum[j]+=2;
			}
		}
	}
	k=0;
	for(int i=3;i<=14;i++)//三顺子 
	{
		if(sum[i]<=2)k=0;
		else
		{
			k++;
			if(k>=2)
			{
				for(int j=i;j>=i-k+1;j--)sum[j]-=3;
				dfs(t+1);
				for(int j=i;j>=i-k+1;j--)sum[j]+=3;
			}
		}
	}
	for(int i=2;i<=14;i++)//带牌 
	{
		if(sum[i]==3)//三带一 
		{
			sum[i]-=3;
			for(int j=2;j<=15;j++)//带一张 
			{
				if(sum[j]==0||i==j)continue;
				sum[j]--;
				dfs(t+1);
				sum[j]++;
			}
			for(int j=2;j<=14;j++)//带一对 
			{
				if(sum[j]<=1||i==j)continue;
				sum[j]-=2;
				dfs(t+1);
				sum[j]+=2;
			}
			sum[i]+=3;
		}
		else if(sum[i]==4)
		{
			sum[i]-=3;//三带一 
			for(int j=2;j<=15;j++)//带一张 
			{
				if(sum[j]==0||i==j)continue;
				sum[j]--;
				dfs(t+1);
				sum[j]++;
			}
			for(int j=2;j<=14;j++)//带一对 
			{
				if(sum[j]<=1||i==j)continue;
				sum[j]-=2;
				dfs(t+1);
				sum[j]+=2;
			}
			sum[i]+=3;
			sum[i]-=4;//四带二
			for(int j=2;j<=15;j++)//带二张 
			{
				if(sum[j]==0||i==j)continue;
				sum[j]--;
				for(int k=2;k<=15;k++)
				{
					if(sum[k]==0||j==k||i==k)continue;
					sum[k]--;
					dfs(t+1);
					sum[k]++;
				}
				sum[j]++;
			}
			for(int j=2;j<=14;j++)//带二对 
			{
				if(sum[j]<=1||i==j)continue;
				sum[j]-=2;
				for(int k=2;k<=14;k++)
				{
					if(sum[k]<=1||j==k||i==k)continue;
					sum[k]-=2;
					dfs(t+1);
					sum[k]+=2;
				}
				sum[j]+=2;
			}
			sum[i]+=4;
		}
	}
	for(int i=2;i<=15;i++)if(sum[i])t++;//出剩下的牌 
	Min=min(Min,t);
	return;
}
int main()
{
//	freopen("p2668.in","r",stdin);
//	freopen("p2668.out","w",stdout);
	scanf("%d%d",&T,&n);
	while(T--)
	{
		Min=0x3f3f3f3f;
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=n;i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			if(a==0)
			{
				sum[15]++;
			}
			else if(a==1)
			{
				sum[14]++;
			}
			else
			{
				sum[a]++;
			}
		}
		dfs(0);
		printf("%d\n",Min);
	}
	return 0;
}

提交记录

@yinbe 是我的大号,我拿大号的提交记录

2024/2/25 12:19
加载中...