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;
}