一:图的概念,图模拟一组连接;可以认为是连接关系的集合。

    例如:我们将A认识B记录为:A-->B,

           将A认识C记录为:A-->C,

         将C认识D记录为:C-->D,

    那么类似的这样一组关系集合就可以称为图。

  其中A,B,C,D我们称之为节点,他们之间的关系称之为路径

那么图的广度优先遍历问题就可以概括为:从节点1到节点2有无路径的问题。也可以回答路径最短问题

如上面的例子,假如A要找到D,由于使用的是广度优先遍历,因此,我们先从A认识的人中找,在从A认识的人中

(B,C)认识的人中找直到找到最后

 

-- Lua代码

-- 广度优先
local nameTable = {
["you"] = {"Lily", "Lucy", "Jack"},
["Jack"] = {"Jone", "Bob", "Pitter"},
["Lily"] = {"Kim", "Ken"},
["Lucy"] = {"Tom", "Matin"},
["Matin"] = {"Naruato"},
["Naruato"] = {"Sakura", "Sasukai", "Hinata"}
}

function Find(tab, destination, key)

  if tab == nil then
    return
  end
  print("新一轮")
  local tmpQueue = {}
  for i = 1, #tab do
    -- print(tab[i] .. " Line 18")
    if tab[i] == destination then
      -- Find(nameTable["you"], key, "you")
      print(key .." Find " .. destination)
      return
    else
      if nameTable[tab[i]] == nil then

      else
        for j = 1, #nameTable[tab[i]] do
          table.insert(tmpQueue, #tmpQueue + 1, nameTable[tab[i]][j]) -- 新找到的人加入表,待本轮结束后继续进行搜索
        end
      end

    end
  end
  if #tmpQueue == 0 then
    -- 执行到这里就没找到了

  else
    Find(tmpQueue, destination, key)
  end
end

Find(nameTable["you"], "Hinata", "you")

执行结果:

新一轮
新一轮
新一轮
新一轮
you Find Hinata  -- 执行四轮找到目标

假如我们将

["Jack"] = {"Jone", "Bob", "Pitter"}, 改为 ["Jack"] = {"Jone", "Bob", "Pitter","Hinata"},

结果将变成

新一轮
新一轮
you Find Hinata -- 执行两轮

 

--  有错欢迎指出 --

posted on 2019-03-14 20:35  百晓灵狐  阅读(293)  评论(0)    收藏  举报