其他分享
首页 > 其他分享> > 面试题——整理背包

面试题——整理背包

作者:互联网

        /// <summary>
        /// 背包整理是游戏中常用的逻辑,将玩家目前背包中的所有格子,按照ID排序统一摆放,同时每个格子中的道具数量不能超过20.
        /// 输入
        /// [[100,4], [101, 5], [0, 0], [100, 5], [101, 8]],20
        /// 输出
        /// [[100, 9],[101,13]]
        /// 说明正常的整理
        /// </summary>
        /// <param name="vtBag"></param>
        /// <param name="maxStack"></param>
        /// <returns></returns>
        public List<List<int>> TidyBag(List<List<int>> vtBag, int maxStack) {
            List<List<int>> bag = new List<List<int>>();
            for (int i = 0; i < vtBag.Count; i++) {
                if (vtBag[i][0] != 0) {
                    int index = HasItem(vtBag[i][0], bag);
                    if (index == -1) {
                        bag.Add(vtBag[i]);
                    } else {
                        bag[index][1] += vtBag[i][1];
                    }
                }
            }
            bag.Sort((a, b) => { return a[0] > b[0] ? 1 : -1; });//对bag排序

            List<List<int>> lastBag = new List<List<int>>();
            foreach (List<int> item in bag) {
                if (item[1] > maxStack) {
                    //Console.WriteLine()
                    int i = 0;
                    for (; i < item[1] / maxStack; i++) {
                        lastBag.Add(new List<int> { item[0], maxStack });
                    }
                    lastBag.Add(new List<int> { item[0], item[1] % maxStack });//多余的
                } else {
                    lastBag.Add(item);
                }
            }
            return lastBag;
        }

        public int HasItem(int id, List<List<int>> bag) {//判断是否存在
            for (int i = 0; i < bag.Count; i++) {
                if (bag[i][0] == id) {
                    return i;       //存在返回index
                }
            }
            return -1;      //返回-1则无此项
        }

 

标签:vtBag,面试题,背包,item,int,List,maxStack,bag,整理
来源: https://blog.csdn.net/ZuoXuanZuo/article/details/117931262