以下的分配物品的算法(游戏的带有tag的合成系统)该咋设计
大概是我理解能力不行,读了七八遍,才自认为算是把你的点Get到了。简要答一下关键点:如果你们的系统没我想象中复杂的话,“特异性高的物品”,可粗暴定义为词缀数量少的物品。如,“木块”只有一个“木质”词缀修饰,而“木槌”却可能被“木质”、“钝击”、“武器”等多个词缀来修饰,于是就可以说木块的特异性高于木槌。特异性越高,其用途越少,当然要被优先使用。1. 遍历时,优先使用掉特异性高的物品。即若有多个物品可以被使用,则优先使用特异性高的。2. 若有物品可以被使用,则继续遍历该物品的其它词缀,看是否满足其它需求。即,若两个物品特异度相等,都是有两个词缀。然而物品A在本次合成时有两个词缀可以被使用,物品B却只有一个词缀在本次合成时可以被使用,则优先使用物品B,以保证词缀不被浪费。照顾到以上两点,你至少能够做个没Bug的版本。
■网友
二分图最大匹配二分图的最大匹配、完美匹配和匈牙利算法趁有空码了下代码,talk is cheap,this is code# -*- coding: utf-8 -*-from collections import defaultdictdemand = {\t\u0026#39;小刚\u0026#39;: ,\t\u0026#39;小红\u0026#39;: ,\t\u0026#39;小明\u0026#39;: ,}attribute = {\t\u0026#39;西红柿\u0026#39;: ,\t\u0026#39;足球\u0026#39;: ,\t\u0026#39;红苹果\u0026#39;: ,}def utf2gbk(s):\treturn s.decode(\u0026#39;utf8\u0026#39;).encode(\u0026#39;gbk\u0026#39;)def print_map(m):\tif m is None:\t\treturn\tfor k, v in m.items():\t\tif isinstance(v, str):\t\t\tprint utf2gbk(k), \u0026#39;-\u0026#39;, utf2gbk(v)\t\telse:\t\t\tprint utf2gbk(k), \u0026#39;-\u0026#39;, \u0026#39;) + \u0026#39;]\u0026#39;def match(vertexs, edges):\tmatched = dict()\tvis = set()\tdef dfs(v):\t\tfor adj in edges:\t\t\tif adj not in vis:\t\t\t\tvis.add(adj)\t\t\t\tif adj not in matched or dfs(matched):\t\t\t\t\tmatched, matched = v, adj\t\t\t\t\treturn True\t\treturn False\tmiss = 0\tfor v in vertexs:\t\tif v not in matched:\t\t\tvis.clear()\t\t\tif not dfs(v):\t\t\t\tmiss += 1\tif (len(vertexs) - miss) \u0026lt; 2*len(demand):\t\treturn None\treturn matcheddef main():\tvertexs = set(demand.keys()) | set(attribute.keys())\tattributeInv = defaultdict(list)\tfor k, v in attribute.items():\t\tfor attr in v:\t\t\tattributeInv.append(k)\tedges = defaultdict(set)\tfor k, v in demand.items():\t\tcandidates = set()\t\tfor i, attr in enumerate(v):\t\t\tcandidates = set(attributeInv) if i == 0 else candidates \u0026amp; set(attributeInv)\t\tfor c in candidates:\t\t\tedges.add(c)\t\t\tedges.add(k)\tprint_map(edges)\tprint \u0026#39;-\u0026#39;*10\tassign = match(vertexs, edges)\tprint_map(assign)if __name__ == \u0026#39;__main__\u0026#39;:\tmain()
■网友
应该可以用二分图匹配来做。
■网友
你这个是合成类型的问题,在以前回合制游戏中挺常见的,具体做法如下。你在道具表中增加一个字段,叫做合成类型,该类型以数组的方式存到数据类中,包含该道具的所有合成类型属性。然后合成的时候在设计上,固定每个格子确认只能放某种类型,就是合成列表顺序,确定好,比如,a=b*2+c 那么 第一个位置就一定是放b,第二个位置放c。再然后,你就是放入的时候去遍历你这个道具的合成类型数组,是否包含该类型,如果包含,就满足条件,不包含就不能放入即可!
推荐阅读
- 旅行|需要准备哪些物品?全面冬季出游清单,建议收藏带宝宝出门旅行
- 孕妇|多半是贫血了,需尽早应对!孕妇身体出现以下4个异常
- 婴儿|美国儿科学会: 1岁以下婴儿不推荐学习游泳
- 女子23年前分配工作至今未有通知,“单位”仲裁解除劳动关系
- 女子网上挂售婚纱,没想到被套路了……
- 网通社|喜欢TNGA架构平台的注意!新款丰田雷凌这回也有了 即日起就可以下订
- 名单|收藏:3岁以下宝宝的最佳非处方药(OTC)名单。
- 怎样看待ofo在单车上标出“禁止十二周岁以下儿童骑车”的警示语
- 如果中国市场的 iPhone 售价降到 3000 以下,会发生啥事情
- 条件|娃不容易生病宝宝出生后多久能出门?满足以下几个条件再出去
