Introducción

1

¿Qué es un grafo?

2

¿Qué es un árbol?

3

¿Qué es recursión?

4

Aplicaciones reales de grafos y árboles

5

Formas de representar un grafo

DFS

6

Análisis de DFS: algoritmo de búsqueda en profundidad

7

Programando DFS de forma recursiva

8

Otras formas de programar DFS

9

Recorridos y profundidad de un Árbol

10

Sum Root to Leaf Numbers: análisis del problema

11

Solución de Sum Root to Leaf Numbers

12

Playground: Sum Root to Leaf Numbers

13

Programando Sum Root to Leaf Numbers en Golang

14

Number of Islands: análisis del problema

15

Solución de Number of Islands

16

Playground: Number of Islands

17

Programando Number of Islands en Python

18

Ejercicios recomendados de DFS

19

Ejercicios resueltos de DFS

BFS

20

Análisis de BFS: algoritmo de búsqueda en anchura

21

Programando BFS con Python

22

Minimum Knights Moves (movimientos de caballo en ajedrez): análisis del problema

23

Solución de Minimum Knights Moves

24

Playground: Minimum Knights Moves

25

Programando Minimum Knights Moves con Python

26

Rotting Oranges: análisis del problema

27

Solución de Rotting Oranges

28

Playground: Rotting Oranges

29

Rotting Oranges con Java

30

Shortest Bridge Between Islands: análisis del problema

31

Solución de Shortest Bridge Between Islands

32

Playground: Shortest Bridge Between Islands

33

Programando Shortest Bridge Between Islands con Python

34

Ejercicios recomendados de BFS

35

Ejercicios resueltos de BFS

Backtrack

36

Algoritmo de Backtrack

37

Letter Combinations of a Phone Number: análisis del problema

38

Solución de Letter Combinations of a Phone Number

39

Programando Letter Combinations of a Phone Number con C++

40

Playground: Letter Combinations of a Phone Number

41

Restore IP Addresses: análisis del problema

42

Programando Restore IP Addresses con C++

43

Playground: Restore IP Addresses

44

Word Search: análisis del problema

45

Solución de Word Search

46

Playgrund: Word Search

47

Programando Word Search JavaScript

48

Reto: N Queens Puzzle

49

Ejercicios recomendados de Backtrack

50

Ejercicios resueltos de Backtrack

Próximos pasos

51

¿Qué otros algoritmos y tipos de grafos puedes aprender?

52

¿Quieres más cursos avanzados de algoritmos?

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
2 Hrs
19 Min
23 Seg

Solución de Rotting Oranges

27/52
Recursos

Aportes 4

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Se me ocurre como solución al problema, analizar a partir de “radios” de infección de cada naranja, así podemos determinar por medio de matemáticas cuanto tardaría en infectar todo el campo una naranja podrida.

Luego podríamos comparar el tiempo mínimo de infección entre todas las naranjas podridas, y hacer algún calculo de densidad. Por ejemplo si hay densidad de naranjas podridas en una sola esquina del campo, podríamos asumir, que con el primer calculo es suficiente.

Pero si la densidad no es homogénea (es decir no están en una sola esquina, sino dispersas), podríamos hacer un análisis más profundo y ver cuando reduce en días, el resultado obtenido previamente.

Esa es una idea que se me ocurre que podría ser computacionalmente más económica, aunque atenida a ciertas condiciones, por ejemplo conocer las posiciones de antemano (en una lista) de las naranjas podridas, y contar con un campo finito.

Hola Chicos \n Yo estoy buscando my Solucion por Breadth First SeRCH 'BFS' . Yo tengo este Algoritmo que me hice guidado de un tutorial Podcast de Youtube meses atras. \nally se implementa Queue paea soportar la busqueda pro anchura de la Grid de una matrix en Adyacencia. Yo no he dado con la solucion aun\n pero cerca estoy \n yo he visto que la queue ( ) es bien importante asi como isVisisted() \n Este problema tambien se debe solucionar por Matrix de adyacencia\n ademas { 1, 0 } existe valores en '2' que representan lo 'rotten Orange ' por tanto unicamente faltase uun condicional dponde compruebe ( arr\[ node ]\[index ] == '2' dentro de mi inner for loop \n ```c# #include <iostream> #define size 36 #define V 6 using namespace std; int Queue[size]; int front = 0; int rear = 0; int isQueueEmpty() { if(front == rear) return 1; return 0; } int dequeue() { if(front == rear) return -1; else { int temp = Queue[front]; front++; return temp; } } void enqueue(int val) { if(rear == size) return; else { Queue[rear] = val; rear++; } } void bfs(int arr[V][V], int source) { int isVisited[V] = {0}; int index; enqueue(source); isVisited[source] = 1; while(!isQueueEmpty()) { int node = dequeue(); cout<<"Visited Node : "<<node<<endl; for(index = 0; index < V; index++) { if(arr[node][index] == 1 && isVisited[index] == 0) { enqueue(index); isVisited[index] = 1; } } } for ( int i = 0; i< V ; i ++ ) { cout << isVisited[i] << "\t" ; } cout << "\n"; } ```#include \<iostream> \#define size 36 \#define V 6 using namespace std; int Queue\[size]; int front = 0; int rear = 0; int isQueueEmpty() { if(front == rear) return 1; return 0; } int dequeue() { if(front == rear) return -1; else { int temp = Queue\[front]; front++; return temp; } } void enqueue(int val) { if(rear == size) return; else { Queue\[rear] = val; rear++; } } void bfs(int arr\[V]\[V], int source) { int isVisited\[V] = {0}; int index; enqueue(source); isVisited\[source] = 1; while(!isQueueEmpty()) { int node = dequeue(); cout<<"Visited Node : "<\<node<\<endl; for(index = 0; index < V; index++) { if(arr\[node]\[index] == 1 && isVisited\[index] == 0) { enqueue(index); isVisited\[index] = 1; } } } for ( int i = 0; i< V ; i ++ ) { cout << isVisited\[i] << "\t" ; } cout << "\n"; }
Tambien se puede resolver con DFS, la complejidad temporal creo que tambien seria O(n^2) porque tendrían que recorerse todos los caminos posibles para poder determinar cual es la mayor cantidad de dias que pueden tardar en podrirse todas las naranjas. es correcto mi razonamiento?
Aqui dejo mi solucion en java. Que tal les parece, se me hizo parecido al de los movimientos del caballo ```java public class RottingOranges { private static final Set<Point> VISITED_ROTTEN_ORANGES = new LinkedHashSet<>(); private static final Set<Point> SPREAD_DIRECTIONS = Set.of( new Point(1,0), new Point(0,1), new Point(-1,0), new Point(0,-1) ); public static void main(String[] args) { final int[][] orangesBox = buildOrangesBox(); System.out.println("here is the oranges box: "); printMatrix(orangesBox); System.out.printf("Days required for oranges to be rotten: [%d]", calculateDays(orangesBox)); } /** * returns the quantity of days required to the adjacent healthy oranges to rotten ones to be rotten * a healthy orange gets rotten when past a day besides to a rotten orange * * @param orangesBox with the oranges distribution * @return the quantity of days required for oranges to get rotten */ private static int calculateDays(int[][] orangesBox) { if(Objects.isNull(orangesBox) || orangesBox.length == 0){ return 0; } int days = 0; for(int x = 0; x < orangesBox.length; x++){ for(int y = 0; y < orangesBox[x].length; y++){ if(orangesBox[x][y] == 2){ final Point rottenOrange = new Point(x,y); VISITED_ROTTEN_ORANGES.add(rottenOrange); days = Math.max(days, startSpreading(rottenOrange, orangesBox)); } } } return days; } private static int startSpreading(Point point, int[][] orangesBox) { int days = 0; final Queue<Point> adjacentOranges = getAdjacentOranges(point, orangesBox); while (!adjacentOranges.isEmpty()){ int size = adjacentOranges.size(); for(int i = 0; i < size; i++){ Point healthyOrange = adjacentOranges.poll(); orangesBox[healthyOrange.getX()][healthyOrange.getY()] = 2; adjacentOranges.addAll(getAdjacentOranges(healthyOrange, orangesBox)); } printMatrix(orangesBox); days ++; } return days; } private static Queue<Point> getAdjacentOranges(Point point, int[][] orangesBox) { final Queue<Point> adjacentOranges = new LinkedList<>(); for(Point direction : SPREAD_DIRECTIONS){ Point newDirection = new Point(point.getX() + direction.getX(), point.getY() + direction.getY()); if(newDirection.getX() >= 0 && newDirection.getY() >= 0 && newDirection.getX() < orangesBox.length && newDirection.getY() < orangesBox[newDirection.getX()].length && !VISITED_ROTTEN_ORANGES.contains(newDirection) && orangesBox[newDirection.getX()][newDirection.getY()] == 1 ) { VISITED_ROTTEN_ORANGES.add(newDirection); adjacentOranges.add(newDirection); } } return adjacentOranges; } /** * this method builds an oranges box * 0 is an empty space in the box * 1 is a healthy orange * 2 is a rotten orange * @return an n*m matrix with oranges */ private static int[][] buildOrangesBox() { return new int[][] { {1,1,1,0}, {1,0,1,1}, {1,2,0,0}, {1,1,0,1}, }; } } ```