zoukankan      html  css  js  c++  java
  • 广度优先遍历

    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;
    }
    }
    }
    }
    }
    

      

  • 相关阅读:
    Qt全局坐标和相对坐标
    坐标系统
    qt坐标系统见解
    Qt中QGraphics类坐标映射关系详解
    对QT多线程以及事件投递的理解
    Qt中mouseMoveEvent无效
    递归、尾递归
    末日重生
    201314
    归并排序
  • 原文地址:https://www.cnblogs.com/nywd/p/2359692.html
Copyright © 2011-2022 走看看