No es una solución, pero tal vez pueda pensar esta idea un poco más. El problema es que también necesitará calcular la ruta más larga posible para obtener todas las rutas. El longest path problem es NP completo para gráficos generales, por lo que tardará mucho tiempo incluso en gráficos pequeños relativos (8x8 y mayores).
Imagine que el vértice de inicio está en la esquina superior izquierda, y el vértice final está en la esquina inferior derecha de la matriz.
- Para una matriz 1x2 sólo hay 1 posible camino
- matriz 2x2 => 2 *** 1 ** caminos => 2
- matriz 3x2 => 2 *** 2 ** caminos = > 4
- matriz 3x3 => 2 *** 4 ** + 2 * 2 caminos => 12
- matriz 3x4 => 2 *** 12 ** + 12 + 2 caminos => 38
Cada vez que combiné los resultados del cálculo anterior para el número actual de rutas. Podría ser que hay una fórmula cercana para un gráfico tan plano, tal vez incluso hay mucha teoría para eso, pero soy demasiado estúpido para eso ...
Puedes usar la siguiente Java (lo siento, no soy un ++ experto c: - /) de fragmento de código para calcular los posibles caminos para matrices más grandes:
public static void main(String[] args) {
new Main(3, 2).start();
}
int xSize;
int ySize;
boolean visited[][];
public Main(int maxX, int maxY) {
xSize = maxX;
ySize = maxY;
visited = new boolean[xSize][ySize];
}
public void start() {
// path starts in the top left corner
int paths = nextCell(0, 0);
System.out.println(paths);
}
public int nextCell(int x, int y) {
// path should end in the lower right corner
if (x == xSize - 1 && y == ySize - 1)
return 1;
if (x < 0 || y < 0 || x >= xSize || y >= ySize || visited[x][y]) {
return 0;
}
visited[x][y] = true;
int c = 0;
c += nextCell(x + 1, y);
c += nextCell(x - 1, y);
c += nextCell(x, y + 1);
c += nextCell(x, y - 1);
visited[x][y] = false;
return c;
}
=>
- 4x4 => 184
- 5x5 => 8512
- 6x6 => 1262 816
- 7x7 (aunque este caso simple toma mucho tiempo!) => 575780564
Esto significa que podría (sólo teóricamente) calcular todas las posibles rutas desde cualquier posición de una matriz MxM en la parte inferior, a la derecha esquina y luego usar esta matriz para buscar rápidamente el número de caminos. Dynamic programming (usando resultados calculados previamente) podría acelerar un poco las cosas.
El número de rutas posibles será mucho mayor que el número de rutas consideradas por un BFS, así que no veo cómo podría ayudar. Un BFS combina repetidamente caminos similares, lo que reduce la complejidad. La complejidad de un BFS es O (| V | + | E |). – fgb
¿Desea una lista de todas las rutas o solo la cantidad de rutas? Si desea el número de rutas, ¿se conformaría con una aproximación? – user287792
No quiero la lista de ellos. quiero calcular el recuento de ellos sin contarlos. –