zoukankan      html  css  js  c++  java
  • java实现第七届蓝桥杯打靶

    打靶

    题目描述
    小明参加X星球的打靶比赛。
    比赛使用电子感应计分系统。其中有一局,小明得了96分。

    这局小明共打了6发子弹,没有脱靶。
    但望远镜看过去,只有3个弹孔。
    显然,有些子弹准确地穿过了前边的弹孔。

    不同环数得分是这样设置的:
    1,2,3,5,10,20,25,50

    那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?

    下面的程序解决了这个问题。
    仔细阅读分析代码,填写划线部分缺失的内容。

    // 答案:ho - (i == 0 ? 0 : 1)
    public class Mian {
    	/*
    	 * ta:代表不同环数的得分
    	 * da:da[i],代表在第i环上打了da[i]枪
    	 * k:表示接下来打来讨论第k环打了多少次
    	 * ho:表示目前还剩下几个孔没讨论
    	 * bu:表示目前打了6-bu枪,即还能打机枪
    	 * sc:表示目前已经打了96-sc分
    	 */
    	static void f(int[] ta, int[] da, int k, int ho, int bu, int sc) {
    		if (ho < 0 || bu < 0 || sc < 0)
    			return;
    		if (k == ta.length) {
    			if (ho > 0 || bu > 0 || sc > 0)
    				return;
    			for (int i = 0; i < da.length; i++) {
    				for (int j = 0; j < da[i]; j++)
    					System.out.print(ta[i] + " ");
    			}
    			System.out.println();
    			return;
    		}
    		for (int i = 0; i <= bu; i++) {
    			da[k] = i;
    			// 如果第ta[i]换不打,即i=0,则讨论下一枪的情况时,还有ho个孔没打;若i!=0,则讨论下一枪的情况时,有ho-1个孔还没打。
    			f(ta, da, k + 1, ho - (i == 0 ? 0 : 1), bu - i, sc - ta[k] * i); // 填空位置
    		}
    		da[k] = 0;
    	}
     
    	public static void main(String[] args) {
    		int[] ta = { 1, 2, 3, 5, 10, 20, 25, 50 };
    		int[] da = new int[8];
    		f(ta, da, 0, 3, 6, 96);
    	}
    }
    
  • 相关阅读:
    [leetCode]404. 左叶子之和
    [leetCode]572. 另一个树的子树
    [leetCode]226. 翻转二叉树
    [leetCode]637. 二叉树的层平均值
    [leetCode]102. 二叉树的层序遍历
    [leetCode]590. N叉树的后序遍历
    [leetCode]589. N叉树的前序遍历
    [leetCode]145. 二叉树的后序遍历
    [leetCode]94. 二叉树的中序遍历
    [leetCode]381. O(1) 时间插入、删除和获取随机元素
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947473.html
Copyright © 2011-2022 走看看