2020阿里实习笔试-扑克牌-DFS

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

发布了1 篇原创文章 · 获赞 0 · 访问量 145

猜你喜欢

转载自blog.csdn.net/Brave_man_O/article/details/104988271
今日推荐