2020阿里实习笔试-扑克牌-DFS
题目描述
今天小强从一副扑克牌里拿出来一叠,其中包括A,2,3,…,10各四张,其中A代表1.他从这一叠中抽出一些牌给小明,并告诉小明每次可以按照下列方式打出一些牌:
- 单牌:一张牌,例如3
- 对子:数字相同的两张牌,例如77
- 顺子:数字连续的五张牌,例如A2345
- 三对:连续三个对子:例如334455
现在小强想知道最少打出多少次牌可以打光手中的牌.
输入描述:
一行是个空格分隔的整数A1,A2,…A10,分别代表牌为A,2,…,10的个数.
0<=A1,A2,…,A10<=4
保证手上至少有一张牌
输出描述:
仅一行一个整数表示答案
示例:
输入:
1 1 1 2 2 2 2 2 1 1
输出
3
说明:
扫描二维码关注公众号,回复:
10013774 查看本文章
打出三个顺子,分别为:A2345,45678,678910
使用深度优先代码:
public class Main {
public static int min = Integer.MAX_VALUE;
public static boolean check(int[] nums) {
boolean flag = false;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
flag = true;
break;
}
}
return flag;
}
public static void dfs(int[] nums, int count) {
//剪枝
if(count>min)
{
return;
}
if (check(nums)) {
int i = 0;
while (nums[i] == 0) {
i++;
}
//单张
if (nums[i] > 0) {
nums[i]--;
dfs(nums, count+1);
nums[i]++;
}
//对子
if (nums[i] > 1) {
nums[i] -= 2;
dfs(nums,count+1);
nums[i] += 2;
}
//五连
if (i + 5 <= nums.length && nums[i] > 0 && nums[i + 1] > 0 && nums[i + 2] > 0 && nums[i + 3] > 0 && nums[i + 4] > 0) {
for (int j = 0; j < 5; j++) {
nums[i + j]--;
}
dfs(nums, count+1);
for (int j = 0; j < 5; j++) {
nums[i + j]++;
}
}
//三双
if (i + 3 <= nums.length && nums[i] > 1 && nums[i + 1] > 1 && nums[i + 2] > 1) {
nums[i] -= 2;
nums[i + 1] -= 2;
nums[i + 2] -= 2;
dfs(nums, count+1);
nums[i] += 2;
nums[i + 1] += 2;
nums[i + 2] += 2;
}
} else {
if(count<min)
{
min = count;
}
}
}
public static void main(String[] args) {
int[] nums = new int[]{1, 1, 1, 2, 2, 2, 2, 2, 1, 1};
dfs(nums, 0);
System.out.println(min);
}
}