private static int GetMinminutes(int[][] grid)
        {
            int rows = grid.Length;

            if (rows == 0)
            {
                return(0);
            }

            List <int[]> dirs = new List <int[]>()
            {
                new[] { 0, 1 }, new[] { 1, 0 }, new[] { 0, -1 }, new[] { -1, 0 }
            };
            int minutes = 0, cols = grid[0].Length, freshOrange = 0;
            Queue <Cordinate> rottenQueue = new Queue <Cordinate>();

            for (int i = 0; i < grid.Length; i++)
            {
                for (int j = 0; j < grid[0].Length; j++)
                {
                    if (grid[i][j] == 2)
                    {
                        rottenQueue.Enqueue(new Cordinate(i, j));
                    }
                    if (grid[i][j] == 1)
                    {
                        freshOrange++;
                    }
                }
            }
            Console.WriteLine("Total rottenQueue :{0}, and freshOrange :{1}", rottenQueue.Count, freshOrange);

            while (rottenQueue.Count > 0 && freshOrange > 0)
            {
                minutes++;
                int qSize = rottenQueue.Count;
                for (int i = 0; i < qSize; i++)
                {
                    Cordinate cor = rottenQueue.Dequeue();
                    int       x   = cor.x;
                    int       y   = cor.y;

                    PrintMatrix(grid);
                    foreach (var dir in dirs)
                    {
                        int xNew = x + dir[0];
                        int yNew = y + dir[1];

                        if (IsValidOrage(grid, xNew, yNew, rows, cols))
                        {
                            grid[xNew][yNew] = 2;
                            rottenQueue.Enqueue(new Cordinate(xNew, yNew));
                            freshOrange--;
                        }
                    }
                }
            }
            return(freshOrange == 0 ? minutes : -1);
        }
        private static int TreasureIslandIIDemo(char[][] grid)
        {
            int rows = grid.Length;

            if (rows == 0)
            {
                return(0);
            }

            int cols = grid[0].Length, steps = 0;

            bool[,] visited = new bool[rows, cols];
            int[][] dirs = new[] { new[] { 1, 0 }, new[] { 0, 1 }, new[] { -1, 0 }, new[] { 0, -1 } };

            Queue <Cordinate> queue = new Queue <Cordinate>();

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    if (grid[i][j] == 'S')
                    {
                        queue.Enqueue(new Cordinate(i, j));
                        visited[i, j] = true;
                    }
                }
            }

            // No loop from all the starting points.
            while (queue.Count > 0)
            {
                steps++;
                int qSize = queue.Count;
                for (int i = 0; i < qSize; i++)
                {
                    Cordinate cor = queue.Dequeue();
                    int       x   = cor.x;
                    int       y   = cor.y;
                    PrintMatrix(visited);

                    foreach (var dir in dirs)
                    {
                        int xNew = x + dir[0];
                        int yNew = y + dir[1];
                        if (isSafe(grid, visited, xNew, yNew, rows, cols))
                        {
                            if (grid[xNew][yNew] == 'X')
                            {
                                return(steps);
                            }
                            visited[xNew, yNew] = true;
                            queue.Enqueue(new Cordinate(xNew, yNew));
                        }
                    }
                }
            }

            return(-1);
        }
        private static int TreasureIslandBFS(char[][] grid)
        {
            int rows = grid.Length, steps = 0;

            if (rows == 0)
            {
                return(steps);
            }

            int cols = grid[0].Length;
            Queue <Cordinate> queue = new Queue <Cordinate>();

            queue.Enqueue(new Cordinate(0, 0));
            bool[,] visited = new bool[rows, cols];
            visited[0, 0]   = true;
            int[][] directions = new[] { new[] { 1, 0 }, new[] { 0, 1 }, new[] { -1, 0 }, new[] { 0, -1 } };

            //Start BFS
            while (queue.Count > 0)
            {
                int levelSize = queue.Count;
                for (int i = 0; i < levelSize; i++)
                {
                    Cordinate cor = queue.Dequeue();
                    int       x   = cor.x;
                    int       y   = cor.y;
                    PrintMatrix(visited);
                    foreach (var dir in directions)
                    {
                        int newX = x + dir[0];
                        int newY = y + dir[1];
                        if (isValid(grid, visited, newX, newY, rows, cols))
                        {
                            if (grid[newX][newY] == 'X')
                            {
                                return(steps);
                            }
                            visited[newX, newY] = true;
                            queue.Enqueue(new Cordinate(newX, newY));
                        }
                    }
                }
                steps++;
            }

            return(-1);
        }
예제 #4
0
        private static int FindCutOff(IList <IList <int> > forest, int sr, int sc, int tx, int ty, int rows, int cols, int[][] dirs)
        {
            bool[,] seen = new bool[rows, cols];
            Queue <Cordinate> treeQueue = new Queue <Cordinate>();

            treeQueue.Enqueue(new Cordinate(sr, sc));
            int step = 0;

            while (treeQueue.Count > 0)
            {
                step++;
                int qsize = treeQueue.Count;
                for (int i = 0; i < qsize; i++)
                {
                    Cordinate cor = treeQueue.Dequeue();
                    int       x   = cor.x;
                    int       y   = cor.y;

                    foreach (var dir in dirs)
                    {
                        int newX = x + dir[0];
                        int newY = y + dir[1];
                        if (x == newX && y == newY)
                        {
                            return(step);
                        }
                        if (newX >= 0 && newY >= 0 && newX < rows && newY < cols && forest[newX][newY] > 1 && seen[newX, newY] == false)
                        {
                            seen[newX, newY] = true;
                            treeQueue.Enqueue(new Cordinate(newX, newY));
                        }
                    }
                }
            }
            return(-1);
        }
        private static int GetMinHours(int[][] grid)
        {
            int rows = grid.Length;

            if (rows == 0)
            {
                return(0);
            }
            int cols  = grid[0].Length;
            int hours = 0;

            List <int[]> dirs = new List <int[]> {
                new int[] { 0, 1 }, new int[] { 1, 0 }, new int[] { 0, -1 }, new int[] { -1, 0 }
            };

            Queue <Cordinate> zomQueue = new Queue <Cordinate>();
            int humCount = 0;

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    if (grid[i][j] == 1)
                    {
                        zomQueue.Enqueue(new Cordinate(i, j));
                    }
                    else
                    {
                        humCount++;
                    }
                }
            }

            Console.WriteLine("Total zombie :{0}, and human :{1}", zomQueue.Count, humCount);

            while (zomQueue.Count > 0 && humCount > 0)
            {
                hours++;
                int qSize = zomQueue.Count;
                for (int i = 0; i < qSize; i++)
                {
                    Cordinate cor = zomQueue.Dequeue();
                    int       x   = cor.x;
                    int       y   = cor.y;

                    PrintMatrix(grid);
                    foreach (var dir in dirs)
                    {
                        int xNew = x + dir[0];
                        int yNew = y + dir[1];

                        if (IsValidHuman(grid, xNew, yNew, rows, cols))
                        {
                            grid[xNew][yNew] = 1;
                            zomQueue.Enqueue(new Cordinate(xNew, yNew));
                            humCount--;
                        }
                    }
                }
            }

            return(humCount == 0 ? hours : -1);
        }