社区讨论

斗地主求调

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m1qljrr5
此快照首次捕获于
2024/10/01 23:31
去年
此快照最后确认于
2025/11/04 18:21
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int T,n,pk[20],ans=INT_MAX,kk;
void dfs(int x){
	//printf("%lld\n",x);
	//first 12345
	int k=0;
	for (int i=1;i<=15;i++){
		if(pk[i]>=1){
			k++;
		}
		if(pk[i]<1){
			if(k>=5){
				for (int j=i-k;j<i;j++)
					pk[j]--;
				dfs(x+1);
				for (int j=i-k;j<i;j++)
					pk[j]++;
			}
			k=0;
		}
	}
	k=0;
	//second 112233
	for (int i=1;i<=15;i++){
		if(pk[i]>=2){
			k++;
		}
		if(pk[i]<2){
			if(k>=3){
				for (int j=i-k;j<i;j++)
					pk[j]-=2;
				dfs(x+1);
				for (int j=i-k;j<i;j++)
					pk[j]+=2;
			}
			k=0;
		}
	}
	k=0;
	//third 111222
	for (int i=1;i<=15;i++){
		if(pk[i]>=3){
			k++;
		}
		if(pk[i]<3){
			if(k>=2){
				for (int j=i-k;j<i;j++)
					pk[j]-=3;
				dfs(x+1);
				for (int j=i-k;j<i;j++)
					pk[j]+=3;
			}
			k=0;
		}
	}
	k=0;
	//fourth 1112
	for (int i=1;i<=17;i++){
		if(pk[i]>=3){
			for (int j=1;j<=17;j++){
				if(pk[j]>=1 and i!=j){
					pk[i]-=3,pk[j]--;
					dfs(x+1);
					pk[i]+=3,pk[j]++;
				}
			}
		}
	}
	//fifth 11122
	for (int i=1;i<=17;i++){
		if(pk[i]>=3){
			for (int j=1;j<=17;j++){
				if(pk[j]>=2 and i!=j){
					pk[i]-=3,pk[j]-=2;
					dfs(x+1);
					pk[i]+=3,pk[j]+=2;
				}
			}
		}
	}
	//sixth 111122
	for (int i=1;i<=17;i++){
		if(pk[i]>=4){
			for (int j=1;j<=17;j++){
				if(pk[j]>=1 and i!=j){
					for(int k=1;k<=17;k++)
						if(pk[k]>=1 and i!=k and j!=k){
							pk[i]-=4,pk[j]--,pk[k]--;
							dfs(x+1);
							pk[i]+=4,pk[j]++,pk[k]++;
						}
							
				}
			}
		}
	}
	for (int i=1;i<=17;i++){
		if(pk[i]>=4){
			for (int j=1;j<=17;j++){
				if(pk[j]>=2 and i!=j){
					for(int k=1;k<=17;k++)
						if(pk[k]>=2 and i!=k and j!=k){
							pk[i]-=4,pk[j]-=2,pk[k]-=2;
							dfs(x+1);
							pk[i]+=4,pk[j]+=2,pk[k]+=2;
						}
							
				}
			}
		}
	}
	int kk=0;
	for (int i=1;i<=17;i++) 
		if(pk[i]!=0){
			kk++;
		}
	ans=min(ans,kk+x);
}
int main(){
	//freopen("game001.txt","r",stdin);
	cin>>T;
	while(T--){
		memset(pk,0,sizeof pk);
		ans=INT_MAX;
		cin>>n;
		for (int i=1;i<=n;i++){
			int a,b;
			cin>>a>>b;
			if((a==0 and b==1)||(a==0 and b==2)) pk[16]++;
			else if(a==2) pk[17]++;
			else if(a==1) pk[14]++;
			else pk[a]++;
		}
		dfs(0);
		cout<<ans<<endl;
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...