本文共 4718 字,大约阅读时间需要 15 分钟。
下图是一个装备系统的合成图谱,箭头指向的是合成之后的装备,每合成一个装备需要消耗一些金币(标注在矩形框里面),箭头上的数字表示合成所需的材料数量。比如,要合成n个装备A,需要消耗3n个装备B、1n个装备C、4n个装备D,而且还需要消耗26n金币(装备B和装备D的合成与此类似)。
为了简单起见,下面两个题目的装备图谱都是一棵多叉树,而且玩家最初只拥有指定数量的叶子节点的装备,也就是图中的装备C、装备E、装备F和装备G。 注意,下面的图谱只是一个例子,作答的时候不要局限于这个图谱。请从下面的题目中选择一个来作答:
请在收到题目的一至两天内完成,提交的时候只需要提交源代码,并且在代码里面注明选择的是哪个题目。为了规范输入输出,下面给出代码的基本结构,作答的时候不要修改Run函数的函数原型。
using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Compose{ public class Exam { public class MaterialData { public ItemData item; //合成所需的物品 public int count; //合成所需的该物品的数量 } public class ItemData { public int id; //物品 ID public int count; //当前拥有的物品数量 public int costGold; //合成该物品所需的金币 public ListmaterialList; //合成该物品所需的材料 } /// /// 计算用 totalGold 金币最多可以合成的 item 装备的数量 /// /// 要合成的装备 /// 拥有的金币 ///可合成的 item 装备的最大数量 public int Run(ItemData item, int totalGold) { int count = item.materialList.Count; if (count==0) { return item.count; } int curCount = Run(item.materialList[0].item, 0); int conCount = curCount / item.materialList[0].count; int gold=item.materialList[0].item.costGold; if (gold< totalGold) { return 0; } int countGold=gold / totalGold; int minCount = countGold < conCount? countGold:conCount; for (int i = 1; i < count; i++) { curCount = Run(item.materialList[i].item, 0); conCount = curCount / item.materialList[i].count; if (conCount < minCount) { minCount = conCount; } } return minCount; } public ItemData itemDataA { get; private set; } public MaterialData materB { get; private set; } public MaterialData materC { get; private set; } public MaterialData materD { get; private set; } public MaterialData materE { get; private set; } public MaterialData materF { get; private set; } public MaterialData materG { get; private set; } public MaterialData CreatData(int materialCount , int itemCount, int id, int costGold,params MaterialData[] materialDatas) { MaterialData material = new Exam.MaterialData(); material.count = materialCount; ItemData item = new Exam.ItemData(); item.id = id; item.count = itemCount; item.costGold = costGold; item.materialList = new List(); if (materialDatas!=null&&materialDatas.Length>0) { for (int i = 0; i < materialDatas.Length; i++) { item.materialList.Add(materialDatas[i]); } } material.item = item; return material; } public Exam() { this.materG = CreatData(9, 81, 7, 500, null); this.materF = CreatData(5, 150, 6, 500, null); this.materE = CreatData(1, 150, 5, 500, null); this.materD = CreatData(4, 0, 4, 58, materG); this.materC = CreatData(1, 50, 3, 500, null); this.materB = CreatData(3, 0, 2, 53, materE, materF); this.itemDataA = new ItemData(); this.itemDataA.id = 1; this.itemDataA.count = 0; this.itemDataA.costGold = 26; this.itemDataA.materialList = new List (); this.itemDataA.materialList.Add(this.materB); this.itemDataA.materialList.Add(this.materC); this.itemDataA.materialList.Add(this.materD); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Compose{ ////// 中等难度 /// class Program { static void Main(string[] args) { Exam exam=new Exam(); int count=exam.Run(exam.materD.item, exam.materD.item.costGold); Console.WriteLine("可以合成出"+count+ "个装备"); Console.ReadKey(); } }}
转载地址:http://pfrxo.baihongyu.com/