求帮查错,调吐了
查看原帖
求帮查错,调吐了
192631
学而思李老师楼主2020/8/7 11:21

RT,记录

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int T, n;
int ans;
int s[20];

void dfs(int k)
{
	//剪枝 
	if(k > ans) return;
	//顺子
	//单顺
	int tmp = 0;
	for(int i = 3; i <= 14; i ++)
	{
		if(s[i] == 0) tmp = 0;
		else
		{
			tmp ++;
			if(tmp >= 5)
			{
				for(int j = i; j >= i - tmp + 1; j --)
					s[j] --;
				dfs(k + 1);
				for(int j = i; j >= i - tmp + 1; j --)
					s[j] ++;
			}
		}
	} 
	//双顺 
	tmp = 0;
	for(int i = 3; i <= 14; i ++)
	{
		if(s[i] < 2) tmp = 0;
		else
		{
			tmp ++;
			if(tmp >= 3)
			{
				for(int j = i; j >= i - tmp + 1; j --)
					s[j] -= 2;
				dfs(k + 1);
				for(int j = i; j >= i - tmp + 1; j --)
					s[j] += 2;
			}
		}
	}
	//三顺
	tmp = 0;
	for(int i = 3; i <= 14; i ++)
	{
		if(s[i] < 3) tmp = 0;
		else
		{
			tmp ++;
			if(tmp >= 2)
			{
				for(int j = i; j >= i - tmp + 1; j --)
					s[j] -= 3;
				dfs(k + 1);
				for(int j = i; j >= i - tmp + 1; j --)
					s[j] += 3;
			}
		}
	 } 
	//带牌
	for(int i = 2; i <= 14; i ++)
	{
		//三张牌:三带一,三带对 
		if(s[i] == 3)
		{
			s[i] -= 3;
			//三带一
			for(int j = 2; j <= 15; j ++)
			{
				if(s[j] == 0 || j == i) continue;
				s[j] --;
				dfs(k + 1);
				s[j] ++;
			}
			//三带对 
			for(int j = 2; j <= 14; j ++)
			{
				if(s[j] < 2 || j == i) continue;
				s[j] -= 2;
				dfs(k + 1);
				s[j] += 2;
			}
			s[i] += 3;
		}
		//四张牌:四带二,四带两对,三带一,三带对 
		else if(s[i] == 4)
		{
			s[i] -= 3;
			//三带一
			for(int j = 2; j <= 15; j ++)
			{
				if(s[j] == 0 || j == i) continue;
				s[j] --;
				dfs(k + 1);
				s[j] ++;
			}
			//三带对 
			for(int j = 2; j <= 14; j ++)
			{
				if(s[j] < 2 || j == i) continue;
				s[j] -= 2;
				dfs(k + 1);
				s[j] += 2;
			}
			s[i] += 3;
			
			s[i] -= 4;
			//四带二
			for(int j = 2; j <= 15; j ++)
			{
				if(s[j] == 0 || j == i) continue;
				s[j] --;
				for(int l = 2; l <= 15; l ++)
				{
					if(s[l] == 0 || l == i) continue;
					s[l] --;
					dfs(l + 1);
					s[l] ++;
				}
				s[j] ++;
			}
			//四带两对 
			for(int j = 2; j <= 14; j ++)
			{
				if(s[j] < 2 || j == i) continue;
				s[j] -= 2;
				for(int l = 2; l <= 14; l ++)
				{
					if(s[l] < 2 || l == i) continue;
					s[l] -= 2;
					dfs(k + 1);
					s[l] += 2;
				}
				s[j] += 2;
			}
			s[i] += 4;
		}
	}
	//出完其它牌 
	for(int i = 2; i <= 15; i ++)
		if(s[i] > 0)
			k ++;
	ans = min(ans, k);
}

int main()
{
	scanf("%d%d", &T, &n);
	while(T --> 0)
	{
		ans = 1e9;
		memset(s, 0, sizeof s);
		for(int i = 1; i <= n; i ++)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			if(x == 1) s[14] ++;
			else if(x == 0) s[15] ++;
			else s[x] ++;
		}
		dfs(0);
		printf("%d\n", ans);
	}
	return 0;
}
2020/8/7 11:21
加载中...