using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WorldSeek { public class SceneNode { public int SceneID { get; set; } public List<int> AroundScene { get; set; } public SceneNode Parnet { get; set; } public bool Visited { get; set; } public SceneNode() { AroundScene = new List<int>(); Visited = false; Parnet = null; } } public class WorldScenePeek { private static WorldScenePeek _worldScenePeek; private static List<SceneNode> _nodes; private WorldScenePeek() { _nodes = new List<SceneNode> { new SceneNode{SceneID = 101,AroundScene = new List<int>{102,104,105,107,109}}, new SceneNode{SceneID = 102,AroundScene = new List<int>{120,101}}, new SceneNode{SceneID = 104,AroundScene = new List<int>{101}}, new SceneNode{SceneID = 105,AroundScene = new List<int>{101}}, new SceneNode{SceneID = 107,AroundScene = new List<int>{101}}, new SceneNode{SceneID = 109,AroundScene = new List<int>{112,110,115,101}}, new SceneNode{SceneID = 110,AroundScene = new List<int>{109}}, new SceneNode{SceneID = 112,AroundScene = new List<int>{109}}, new SceneNode{SceneID = 115,AroundScene = new List<int>{109}}, new SceneNode{SceneID = 120,AroundScene = new List<int>{102}}, }; } public static WorldScenePeek Instance { get { return _worldScenePeek ?? (_worldScenePeek = new WorldScenePeek()); } } private SceneNode getNode(int id) { return _nodes.FirstOrDefault(node => node.SceneID == id); } public List<int> seek(int beginId,int endId) { var startNode = getNode(beginId); var endNode = getNode(endId); if(startNode == null || endNode == null) return null; if(startNode.SceneID == endNode.SceneID) return new List<int>{beginId}; //先将所有节点置为未访问,并且没有父节点 foreach(var node in _nodes) { node.Visited = false; node.Parnet = null; } var path = new List<int>(); var success = Find(startNode, endNode); if(success) { var tmpNode = endNode; while(tmpNode != null) { path.Add(tmpNode.SceneID); tmpNode = tmpNode.Parnet; } return path; } return null; } //采用图的广度优先遍历 private bool Find(SceneNode curNode,SceneNode endNode) { curNode.Visited = true; var testList = new List<SceneNode>(); readyTestList(testList, curNode); while(testList.Count > 0) { var readyList = new List<SceneNode>(); foreach(var node in testList) { if(node.SceneID == endNode.SceneID) { return true; } readyTestList(readyList, node); } testList = readyList; } return false; } private void readyTestList(List<SceneNode> testList,SceneNode node) { foreach(var nid in node.AroundScene) { var subNode = getNode(nid); if(subNode!=null && !subNode.Visited) { testList.Add(subNode); subNode.Visited = true; subNode.Parnet = node; } } } } }