Exemple #1
0
    public static int DistanceClosestToCentralPortByLength(DirectionPath wireA, DirectionPath wireB)
    {
        var bounds              = GetBounds(wireA, wireB);
        var grid                = new GridValue[bounds.size.x, bounds.size.y];
        var gridDistanceA       = new int[bounds.size.x, bounds.size.y];
        var gridDistanceB       = new int[bounds.size.x, bounds.size.y];
        var centralPortPosition = new Vector2Int(Mathf.Abs(bounds.min.x), Mathf.Abs(bounds.min.y));

        grid[centralPortPosition.x, centralPortPosition.y] = GridValue.CentralPort;

        grid = FillGrid(grid, wireA, GridValue.A, GridValue.B, centralPortPosition, gridDistanceA);
        grid = FillGrid(grid, wireB, GridValue.B, GridValue.A, centralPortPosition, gridDistanceB);

        var minDistance = Int32.MaxValue;

        for (int y = grid.GetLength(1) - 1; y >= 0; y--)
        {
            for (int x = 0; x < grid.GetLength(0); x++)
            {
                if (grid[x, y] == GridValue.AB)
                {
                    minDistance = Mathf.Min(minDistance, gridDistanceA[x, y] + gridDistanceB[x, y]);
                }
            }
        }


        return(minDistance);
    }
Exemple #2
0
    private static (int selectedX, int selectedY) FindMins(DirectionPath wire, Func <int, int, int> selectionFunction)
    {
        int selectedX = 0;
        int selectedY = 0;
        int x = 0, y = 0;

        foreach (var node in wire.Nodes)
        {
            if (node.Direction == 'L')
            {
                x -= node.Distance;
            }
            else if (node.Direction == 'R')
            {
                x += node.Distance;
            }
            else if (node.Direction == 'D')
            {
                y -= node.Distance;
            }
            else if (node.Direction == 'U')
            {
                y += node.Distance;
            }

            selectedX = selectionFunction(selectedX, x);
            selectedY = selectionFunction(selectedY, y);
        }
        return(selectedX, selectedY);
    }
Exemple #3
0
    public static int DistanceClosestToCentralPort(DirectionPath wireA, DirectionPath wireB)
    {
        var bounds = GetBounds(wireA, wireB);
        var grid   = new GridValue[bounds.size.x, bounds.size.y];
        var centralPortPosition = new Vector2Int(Mathf.Abs(bounds.min.x), Mathf.Abs(bounds.min.y));

        grid[centralPortPosition.x, centralPortPosition.y] = GridValue.CentralPort;

        grid = FillGrid(grid, wireA, GridValue.A, GridValue.B, centralPortPosition);
        grid = FillGrid(grid, wireB, GridValue.B, GridValue.A, centralPortPosition);

        //var str = "";
        var minDistance = Int32.MaxValue;

        for (int y = grid.GetLength(1) - 1; y >= 0; y--)
        {
            for (int x = 0; x < grid.GetLength(0); x++)
            {
                //str += GridValueToChar(grid[x, y]);
                if (grid[x, y] == GridValue.AB)
                {
                    minDistance = Mathf.Min(minDistance, Mathf.Abs(x - centralPortPosition.x) + Mathf.Abs(y - centralPortPosition.y));
                }
            }
            //str += "\n";
        }

        //Debug.Log(str);

        return(minDistance);
    }
Exemple #4
0
    private static BoundsInt GetBounds(DirectionPath wireA, DirectionPath wireB)
    {
        var minsA = FindMins(wireA, (min, x) => Mathf.Min(min, x));
        var minsB = FindMins(wireB, (min, x) => Mathf.Min(min, x));
        var maxsA = FindMins(wireA, (min, x) => Mathf.Max(min, x));
        var maxsB = FindMins(wireB, (min, x) => Mathf.Max(min, x));
        var minX  = Mathf.Min(minsA.selectedX, minsB.selectedX);
        var minY  = Mathf.Min(minsA.selectedY, minsB.selectedY);
        var maxX  = Mathf.Max(maxsA.selectedX, maxsB.selectedX);
        var maxY  = Mathf.Max(maxsA.selectedY, maxsB.selectedY);

        return(new BoundsInt(minX, minY, 0, maxX - minX + 1, maxY - minY + 1, 0));
    }
Exemple #5
0
    private static GridValue[,] FillGrid(GridValue[,] grid, DirectionPath path, GridValue a, GridValue b, Vector2Int portPosition, int[,] gridDistance = null)
    {
        int x        = portPosition.x;
        int y        = portPosition.y;
        int distance = 0;

        foreach (var wire in path.Nodes)
        {
            var displacement = NodeToDeplacement(wire.Direction, wire.Distance);
            if (IsHorizontal(wire.Direction))
            {
                for (int i = 0; i < wire.Distance; i++)
                {
                    grid[x, y] = ValueToPutOnGrid(grid[x, y], x, y, a, b);
                    if (gridDistance != null && gridDistance[x, y] == 0)
                    {
                        gridDistance[x, y] = distance;
                    }
                    x += displacement;
                    distance++;
                }
            }
            else
            {
                for (int i = 0; i < wire.Distance; i++)
                {
                    grid[x, y] = ValueToPutOnGrid(grid[x, y], x, y, a, b);
                    if (gridDistance != null && gridDistance[x, y] == 0)
                    {
                        gridDistance[x, y] = distance;
                    }
                    y += displacement;
                    distance++;
                }
            }
        }

        return(grid);
    }