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