Пример #1
0
        /// <summary>
        /// Создать копию матрицы, удалив из неё столбец и строку
        /// </summary>
        /// <param name="coord">Удаляемые строка и столбец</param>
        /// <returns>Копия матрицы</returns>
        public RouteMatrix CopyWithoutColAndRow(MatrixCoord coord)
        {
            // Настройка заголовков строк и столбцов создаваемой матрицы
            MatrixHeaders    newHeaders = null;
            RouteMatrixState newState   = RouteMatrixState.Process;
            List <IRoute>    routes     = null;

            var addedRoute = GetRoute(coord);

            if (CanAddPassedRoute(PassedRoutes, addedRoute))    // Контроль за образованием цикла
            {
                routes = new List <IRoute>(PassedRoutes)
                {
                    addedRoute
                };
                newHeaders = Headers.CopyWithoutColRow(coord.Col, coord.Row);

                if (newHeaders.ColumnsCount == 1 &&
                    newHeaders.RowsCount == 1)
                {
                    var newLinesCount = newHeaders.GetLines().Count();
                    if (newLinesCount == 2)
                    {
                        var fromLine = newHeaders.GetLineByRow(0);
                        var toLine   = newHeaders.GetLineByCol(0);
                        var curCoord = Headers.GetCoord(toLine, fromLine);
                        // Оставшийся последним маршрут достижим
                        if (!Items[curCoord.Col, curCoord.Row].IsInfinity)
                        {
                            var lastRoute = GetRoute(curCoord);
                            routes.Add(lastRoute);

                            newState = RouteMatrixState.IsComplete;
                        }
                        else
                        {
                            newState = RouteMatrixState.Unreachable;
                        }
                    }
                    else
                    {
                        newState = RouteMatrixState.Unreachable;
                    }
                    newHeaders = null;
                }
            }
            else
            {
                newState = RouteMatrixState.Unreachable;
            }


            RouteMatrix result = new RouteMatrix(newHeaders, routes, MinTimespan, newState);

            if (result.State == RouteMatrixState.Process)
            {
                for (int col = 0; col < ColumnsCount; ++col)
                {
                    if (col != coord.Col)
                    {
                        var newCol = result.Headers.GetColByLine(Headers.GetLineByCol(col));

                        for (int row = 0; row < RowsCount; ++row)
                        {
                            if (row != coord.Row)
                            {
                                var newRow = result.Headers.GetRowByLine(Headers.GetLineByRow(row));
                                result.Items[newCol, newRow] = Items[col, row];
                            }
                        }
                    }
                }
                // Устанавливаем элемент [row, col] в бесконечность
                var fromLine = Headers.GetLineByRow(coord.Row);
                var toLine   = Headers.GetLineByCol(coord.Col);
                var infCol   = result.Headers.GetColByLine(fromLine);
                var infRow   = result.Headers.GetRowByLine(toLine);
                if (infCol >= 0 && infRow >= 0)
                {
                    result.Items[infCol, infRow].SetInfinity();
                }

                result.FillMinValuesByRows();
                result.FillMinValuesByCols();
                result.CalcCurrentMinTimespan();
            }

            return(result);
        }