private static bool MakeRotten(int[,] input, Queue <OrangePosition> stack, int row, int col, int time) { var rows = input.GetLength(0); var cols = input.GetLength(1); if (!IsValid(rows, cols, row, col) || input[row, col] != 1) { return(false); } input[row, col] = 2; var pos = new OrangePosition(row, col, time); stack.Enqueue(pos); return(true); }
private void EnqueueOranges(int row, int col, int[][] grid, int level, Queue <OrangePosition> queue) { if ( (grid == null || grid.Length == 0 || grid[0] == null || grid[0].Length == 0) || (row < 0 || row >= grid.Length || col < 0 || col >= grid[0].Length) || grid[row][col] != (int)CellStatus.FreshOrange ) { return; } _freshOrangeCount--; _maxLevel = Math.Max(_maxLevel, level); grid[row][col] = (int)CellStatus.RottenOrange; var orangePosition = new OrangePosition(row, col, level); queue.Enqueue(orangePosition); }
public int OrangesRotting(int[][] grid) { if (grid == null || grid.Length == 0 || grid[0] == null || grid[0].Length == 0) { return(-1); } var queue = new Queue <OrangePosition>(); for (int i = 0; i < grid.Length; i++) { for (int j = 0; j < grid[i].Length; j++) { if (grid[i][j] == (int)CellStatus.FreshOrange) { _freshOrangeCount++; } else if (grid[i][j] == (int)CellStatus.RottenOrange) { var orangePosition = new OrangePosition(i, j, 0); queue.Enqueue(orangePosition); } } } while (queue.Count != 0) { var orangePosition = queue.Dequeue(); EnqueueOranges(orangePosition.Row - 1, orangePosition.Column, grid, orangePosition.Level + 1, queue); EnqueueOranges(orangePosition.Row + 1, orangePosition.Column, grid, orangePosition.Level + 1, queue); EnqueueOranges(orangePosition.Row, orangePosition.Column - 1, grid, orangePosition.Level + 1, queue); EnqueueOranges(orangePosition.Row, orangePosition.Column + 1, grid, orangePosition.Level + 1, queue); } return(_freshOrangeCount == 0? _maxLevel : -1); }