【cofun1624】斗地主
Description
Input Format
输入文件名为 landlords.in。
第一行包含用空格隔开的2个正整数T,n,表示手牌的组数以及每组手牌的张数。
接下来T组数据,每组数据n行,每行一个非负整数对ai,bi,表示一张牌,其中ai表示牌的数码,bi表示牌的花色,中间用空格隔开。特别的,我们用 1 来表示数码 A,11 表示数码 J,12 表示数码 Q,13 表示数码 K;黑桃、红心、梅花、方片分别用 1-4 来表示;小王的表示方法为 0 1,大王的表示方法为 0 2。
Output Format
输出文件名为 landlords.out。 共 T 行,每行一个整数,表示打光第i组手牌的最少次数。
Sample Input
【输入样例 1】
1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1
【输入样例 2】
1 17
12 3
4 3
2 3
5 4
10 2
3 3
12 2
0 1
1 3
10 1
6 2
12 1
11 3
5 2
12 4
2 2
7 2
Sample Output
输出样例 1
3
输出样例 2
6
【输入输出样例 1 说明】
共有 1 组手牌,包含 8 张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方片A 以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张牌(黑桃5)以及对子牌(黑桃A 以及方片A)在3次内打光。
Hint
分析:
可以把王炸视为对子,因此花色与问题本身并无关系,牌类种数<=14。
显然只有顺子对出牌顺序产生影响,而三张、对子、单张可以贪心出最少的出牌数。
考虑爆搜+剪枝。- dfs减去顺子.
- 剪枝中贪心出其他的出牌数,加上当前步数若> ans,则直接 return.
具体实现见代码→
- 代码:
#include <bits/stdc++.h>
using namespace std