装备系统的合成-算法题

这是一个公司的面试题,做个记录

下图是一个装备系统的合成图谱,箭头指向的是合成之后的装备,每合成一个装备需要消耗一些金币(标注在矩形框里面),箭头上的数字表示合成所需的材料数量。比如,要合成n个装备A,需要消耗3n个装备B、1n个装备C、4n个装备D,而且还需要消耗26n金币(装备B和装备D的合成与此类似)。
为了简单起见,下面两个题目的装备图谱都是一棵多叉树,而且玩家最初只拥有指定数量的叶子节点的装备,也就是图中的装备C、装备E、装备F和装备G。
注意,下面的图谱只是一个例子,作答的时候不要局限于这个图谱。
请从下面的题目中选择一个来作答:
⦁ (简单难度)已知玩家拥有一些初级装备(叶子节点的装备)并且所有装备的合成所需消耗的金币都为0,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
⦁ (中等难度)已知玩家拥有一些初级装备(叶子节点的装备)和n个金币,并且所有装备的合成都需要消耗金币,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
装备系统的合成-算法题_第1张图片
为了规范输入输出,下面给出代码的基本结构,作答的时候不要修改Run函数的函数原型。

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 materialList; //合成该物品所需的材料
    }

    /// 
    /// 计算用 totalGold 金币最多可以合成的 item 装备的数量
    /// 
    /// 要合成的装备
    /// 拥有的金币
    /// 可合成的 item 装备的最大数量
    public int Run(ItemData item, int totalGold)
    {
        return 0;
    }
}

这个题目给出代码结构,根据以上提供的信息进行分析,最终的函数的入口是一个ItemData类型和一个金币数量。如何去理解这两个类的数据就显得尤其重要。

这个题目我觉得就是考察两个点:1.数据分析处理 2.递归算法 以下给出了(简单解法)

(中等难度的)其实就是多加了一个限制条件,早个时间再来处理

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class xxxxxxxxxxxxx : MonoBehaviour {

	// Use this for initialization
	void Start () {
        Exam ex = new Exam();
        Exam.ItemData item = CreateTestDataA();
        Debug.Log(ex.Run(item,0));
	}
	

    Exam.ItemData CreateTestDataA()
    {
        Exam.ItemData item = new Exam.ItemData();
        item.count = 0;
        item.costGold = 0;
        item.id = 1;
        item.materialList = new List();
        item.materialList.Add( CreateTestDataB());
        item.materialList.Add(CreateTestDataC());
        item.materialList.Add(CreateTestDataD());
        return item;
    }

    Exam.MaterialData CreateTestDataB()
    {
        Exam.MaterialData material = new Exam.MaterialData();
        material.count = 3;
        Exam.ItemData item = new Exam.ItemData();
        item.id = 2;
        item.count = 0;
        item.costGold = 0;
        item.materialList = new List();
        item.materialList.Add(CreateTestDataE());
        item.materialList.Add(CreateTestDataF());
        material.item = item;
        return material;
    }


    Exam.MaterialData CreateTestDataD()
    {
        Exam.MaterialData material = new Exam.MaterialData();
        material.count = 4;
        Exam.ItemData item = new Exam.ItemData();
        item.count = 0;
        item.costGold = 0;
        item.id = 4;
        item.materialList = new List();
        item.materialList.Add(CreateTestDataG());
        material.item = item;
        return material;
    }
    Exam.MaterialData CreateTestDataC()
    {
        Exam.MaterialData material = new Exam.MaterialData();
        material.count = 1;
        Exam.ItemData item = new Exam.ItemData();
        item.count = 100;
        item.id = 3;
        item.costGold = 0;
        material.item = item;
        item.materialList = new List();
        return material;
    }
    Exam.MaterialData CreateTestDataE()
    {
        Exam.MaterialData material = new Exam.MaterialData();
        material.count = 1;
        Exam.ItemData item = new Exam.ItemData();
        item.count = 100;
        item.id = 5;
        item.costGold = 0;
        material.item = item;
        item.materialList = new List();
        return material;
    }
    Exam.MaterialData CreateTestDataF()
    {
        Exam.MaterialData material = new Exam.MaterialData();
        material.count = 5;
        Exam.ItemData item = new Exam.ItemData();
        item.count = 100;
        item.id = 6;
        item.costGold = 0;
        material.item = item;
        item.materialList = new List();
        return material;
    }
    Exam.MaterialData CreateTestDataG()
    {
        Exam.MaterialData material = new Exam.MaterialData();
        material.count = 9;
        Exam.ItemData item = new Exam.ItemData();
        item.count = 100;
        item.id = 7;
        item.costGold = 0;
        material.item = item;
        item.materialList = new List();
        return material;
    }
}


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 materialList; //合成该物品所需的材料
    }

    /// 
    /// 计算用 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 minCount = 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;
            }
        }
        Debug.Log(item.id+":"+minCount);
        return minCount;
    }

}



你可能感兴趣的:(装备系统的合成-算法题)