梦熊 斗地主

#include<bits/stdc++.h>
using namespace std;
int t,n;
int num[50];     
int ans = 100;
void dfs(int step){
	if(step>=ans){
		return;
	}
	int k1=0;
	int k2=0;
	int k3=0;
	for(int i=3; i <= 14; i++) {
		if (num[i] == 0) k1 = 0;
		else {
			k1++;
			if (k1 >= 5) {
				for (int j = i; j >= i - k1 + 1; j--)
					num[j]--;
				dfs(step + 1);
				for (int j = i; j >= i - k1 + 1; j--)
					num[j]++;
			}
		}
		if (num[i] < 2) k2 = 0;
		else {
			k2++;
			if (k2 >= 3) {
				for (int j = i; j >= i - k2 + 1; j--)
					num[j] -= 2;
				dfs(step + 1);
				for (int j = i; j >= i - k2 + 1; j--)
					num[j] += 2;
			}
		}
		if (num[i] < 3) k3 = 0;
		else {
			k3++;
			if (k3 >= 2) {
				for (int j = i; j >= i - k3 + 1; j--)
					num[j] -= 3;
				dfs(step + 1);
				for (int j = i; j >= i - k3 + 1; j--)
					num[j] += 3;
			}
		}
	}
	for (int i = 2; i <= 14; i++) {
		if (num[i] >= 3) {
			num[i] -= 3;
			for (int j = 2; j <= 15; j++) {
				if (num[j] && i != j) {
					num[j]--;
					dfs(step + 1);
					num[j]++;
				}
				if (num[j] >= 2 && i != j && j!=15) {
					num[j] -= 2;
					dfs(step + 1);
					num[j] += 2;
				}
			}
			num[i]+=3;
		}
		if (num[i] >= 4) {
			num[i] -= 4;
			for (int j = 2; j <= 15; j++) {
				if (num[j] && j!=i) {
					num[j]--;
					for (int k = 2; k <= 15; k++) {
						if (num[k] && k!=j) {
							num[k]--;
							dfs(step + 1);
							num[k]++;
						}
					}
					num[j]++;
				}
			}
			for (int j = 2; j <= 14; j++) {
				if (num[j] >= 2 && j!=i) {
					num[j] -= 2;
					for (int k = 2; k <= 14; k++) {
						if (num[k] >= 2) {
							num[k] -= 2;
							dfs(step + 1);
							num[k] += 2;
						}
					}
					num[j] += 2;
				}
			}
			num[i]+=4;
		}
	}
	for(int i = 2;i<=15;i++){
		if(num[i]){
			step++;
		}
	} 
	ans = min(ans,step);
}
int main() {
	cin >> t >> n;
	while (t--) {
		ans = 100;
		memset(num,0,sizeof num);
		for (int i = 1; i <= n; i++) {
			int x,y;
			scanf("%d%d", &x, &y);
			if (x== 0) num[15]++;
			else if (x == 1) num[14]++;
			else num[x]++;
		}
		dfs(0);
		printf("%d\n",ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值