Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }