Exemplo n.º 1
0
        public List <DrawPoint> Find()
        {
            var pointGroups = inner.GroupBy(point => point.X).OrderBy(g => g.Key).Select(g => g.OrderBy(point => point.Y));

            if (string.CompareOrdinal(start.X, finish.X) > 0)
            {
                pointGroups = pointGroups.Reverse();
            }
            var res = new List <DrawPoint>(inner.Count + 2)
            {
                start
            };

            foreach (var group in pointGroups)
            {
                var g = group.ToList();
                if (g.Count == 1)
                {
                    res.Add(g.First());
                    continue;
                }

                if (DrawPoint.GetDistance(res.Last(), g.First()) > DrawPoint.GetDistance(res.Last(), g.Last()))
                {
                    g.Reverse();
                }
                res.AddRange(g);
            }

            res.Add(finish);
            return(res);
        }
        private int[] GetTree()
        {
            var dist   = new int[VertexCount];
            var parent = new int[VertexCount];
            var used   = new bool[VertexCount];

            parent[0] = int.MaxValue;
            for (var i = 1; i < dist.Length; ++i)
            {
                dist[i]   = int.MaxValue;
                parent[i] = int.MaxValue;
            }

            for (var t = 0; t < VertexCount; ++t)
            {
                var current = 0;
                for (var i = 0; i < VertexCount; ++i)
                {
                    if (used[current] || !used[i] && dist[current] > dist[i])
                    {
                        current = i;
                    }
                }
                used[current] = true;
                for (var i = 0; i < VertexCount; ++i)
                {
                    if (used[i])
                    {
                        continue;
                    }
                    var d = DrawPoint.GetDistance(GetPoint(current), GetPoint(i));
                    if (d < dist[i])
                    {
                        dist[i]   = d;
                        parent[i] = current;
                    }
                }
            }

            return(parent);
        }