前端面试题

下图是一个装备系统的合成图谱,箭头指向的是合成之后的装备,每合成一个装备需要消耗一些金币(标注在矩形框里面),箭头上的数字表示合成所需的材料数量。比如,要合成n个装备A,需要消耗3n个装备B、1n个装备C、4n个装备D,而且还需要消耗26n金币(装备B和装备D的合成与此类似)。
为了简单起见,下面两个题目的装备图谱都是一棵多叉树,而且玩家最初只拥有指定数量的叶子节点的装备,也就是图中的装备C、装备E、装备F和装备G。
注意,下面的图谱只是一个例子,作答的时候不要局限于这个图谱。

在这里插入图片描述

请从下面的题目中选择一个来作答:

  1. (简单难度)已知玩家拥有一些初级装备(叶子节点的装备)并且所有装备的合成所需消耗的金币都为0,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
  2. (中等难度)已知玩家拥有一些初级装备(叶子节点的装备)和n个金币,并且所有装备的合成都需要消耗金币,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。

请在收到题目的一至两天内完成,提交的时候只需要提交源代码,并且在代码里面注明选择的是哪个题目。为了规范输入输出,下面给出代码的基本结构,作答的时候不要修改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 List<MaterialData> materialList; //合成该物品所需的材料
        }


        /// <summary>
        /// 计算用 totalGold 金币最多可以合成的 item 装备的数量
        /// </summary>
        /// <param name="item">要合成的装备</param>
        /// <param name="totalGold">拥有的金币</param>
        /// <returns>可合成的 item 装备的最大数量</returns>
        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<MaterialData>();
            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<Exam.MaterialData>();
            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
{
    /// <summary>
    /// 中等难度
    /// </summary>
    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();
        }

    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值