תפוחים רקובים
נתון מערך עם דו מימדי עם ערכים אפשריים: 0 - מקום ריק 1 - תפוח טרי 2 - תפוח רקוב כל דקה תפוח טרי שהיה במגע עם תפוח רקוב הופך להיות גם רקוב. כמה דקות צריכים לעבור עד שכל התפוחים יהיו רקובים. אם זה לא אפשרי - יש להחזיר 1-.
- public int ApplesRotting(int[][] grid) {
- int minutes = 0;
- bool isRottenCreated = true;
- while (isRottenCreated) {
- bool[,] visited = new bool[grid.Length, grid[0].Length];
- isRottenCreated = false;
- for (int row = 0; row < grid.Count(); row++) {
- for (int apple = 0; apple < grid[0].Count(); apple++) {
- if (grid[row][apple] == 2 && !visited[row, apple]) {
- bool created = setRottens(grid, row, apple, visited);
- isRottenCreated = isRottenCreated ? isRottenCreated : created;
- }
- }
- }
- if (isRottenCreated) minutes++;
- }
- return isFreshExists(grid) ? -1 : minutes;
- }
- private bool setRottens(int[][] grid, int x, int y, bool[,] visited) {
- int[,] directions = new int[,] { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
- bool isRottenCreated = false;
- for (int i = 0; i < directions.GetLength(0); i++) {
- int newx = x + directions[i, 0];
- int newy = y + directions[i, 1];
- if (newx >= 0 && newx < grid.Length && newy >= 0 && newy < grid[0].Length && grid[newx][newy] == 1 && !visited[newx, newy]) {
- grid[newx][newy] = 2;
- isRottenCreated = true;
- visited[newx, newy] = true;
- }
- }
- return isRottenCreated;
- }
- private bool isFreshExists(int[][] grid) {
- for (int row = 0; row < grid.Count(); row++) {
- for (int orange = 0; orange < grid[0].Count(); orange++) {
- if (grid[row][orange] == 1)
- return true;
- }
- }
- return false;
- }