※ 引述《kindyayaya (Auto魂)》之銘言
: ※ [本文轉錄自 ask 看板 #1Y1mWKb5 ]
: 作者: kindyayaya (Auto魂) 看板: ask
: 標題: [請問] 樹狀資料整理方式...吧?
口卡口卡吃光光
: ps.合成範例如下
: 死亡之浪(目標)=大爆發+瘟疫噴灑器+瘟疫
: 大爆發=魔法齒輪+火箭炸彈+流星雨
: 火箭炸彈=爆發之箭+同時射擊
: 爆發之箭=魔法齒輪+弩+爆發
: 弩=箭+投石器
: 投石器=箭+巨大化
: 同時射擊=箭+箭
: 流星雨=隕石+同時射擊+爆發
: 隕石=爆發+焚燒+落石
: 同時射擊=箭+箭
: 黃字為底材,這樣完成1/3,後面兩個設施就不打了
: 到底我要幾支箭幾個齒輪阿 崩潰(T_T)
原文恕刪
先補一下程式網址
https://reurl.cc/5Gb1Ov
前幾天看到這篇,不過沒時間回
這問題我拆成兩部分
第一個部分是找零錢,基礎材料就是可以用的零錢種類
但是零錢不夠必須換成特定幾種種類才有辦法找開
總之這問題可以把全部的合成公式轉換成
total = a1 * n1 + a2 * n2 +...
第二部分,撇開需要的數量這點,單純看合成公式
可以把這問題看成親子血緣圖
這部分最好用的就是 prolog 了,可以用這來表達關係
合成目標是父母,合成材料是小孩
於是每一條公式都可以拆解成
formula(total, a1, n1)
formula(total, a2, n2)...
在拆解完問題後,我們得到合成公式的關係表
接下來就可以查表解問題了
這邊我選擇用 minikanren
由於 formula 只能找出親子這一層,我需要動態產生
祖父母或更上層關係的查詢函數
composite_items 就是用來查詢用的函數,後面簡稱 f
第一個參數是合成目標
第二個參數是合成材料
第三個參數是材料數量
完成之後你可以正向查找,也可以反向查找
run 這個函數第一個參數不用管,直接填 0 就好
第二個參數是想知道的結果,例如說箭可以合成什麼,
或是材料的總量等等
第三個開始的參數就是查詢函數
比方說我想知道箭可以做什麼,我參數只要帶一個
f(q, "箭", Var())
之後就能知道箭可以合成什麼
# 第 92 行開始
想知道箭可以合成四層內的什麼道具,就在 f 裡面加入 max_count = 4 就可以了
最後原 po 的問題答案在 99 行那邊
f("死亡之浪", q, v, max_count =10)
base_item(q)
第一個會函數會告訴你死亡之浪需要哪些素材跟數量
第二個函數只會保留基本素材
之後計算總和就完成了
補充,這個我沒寫在上面
你只要問
f(q, "箭", Var())
f(q, "投石器", Var())
它就會告訴你這兩個材料可以合出什麼了
原 po 有問想知道問題的關鍵字,給你參考
prolog、logic programming、minikanren
以上