Non una soluzione, ma forse puoi pensare questa idea un po 'oltre. Il problema è che dovrai calcolare anche il percorso più lungo possibile per ottenere tutti i percorsi. Lo longest path problem è NP completo per grafici generici, quindi otterrà un tempo molto lungo anche per i relativi grafici di piccole dimensioni (8x8 e superiori).
Imagine the start-vertice è in alto, a sinistra ed il vertice fine è nell'angolo in basso a destra della matrice.
- Per una matrice 1x2 c'è solo 1 possibilità percorso
- matrice 2x2 => 2 *** 1 ** percorsi => 2
- matrice 3x2 => 2 *** 2 ** percorsi = > 4
- matrice 3x3 => 2 *** 4 ** + 2 * 2 percorsi => 12
- matrice 3x4 => 2 *** 12 ** + 12 + 2 tracciati => 38
Ogni volta che ho unito i risultati del calcolo precedente per il numero corrente di percorsi. Potrebbe essere che ci sia una stretta formulario per un grafico come planare, forse c'è anche un sacco di teoria per questo, ma io sono troppo stupido per questo ...
È possibile utilizzare il seguente Java (scusate, mi non sono un C++ esperto: - /) snippet per calcolare i possibili percorsi per le matrici più grandi:
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 (anche questo semplice caso prende un sacco di tempo!) => 575780564
Questo significa che si potrebbe (solo teoricamente) calcolare tutti i percorsi possibili da ogni posizione di una matrice MxM al più basso, a destra angolo e quindi utilizzare questa matrice per cercare rapidamente il numero di percorsi. Dynamic programming (utilizzando i risultati calcolati in precedenza) potrebbe velocizzare un po 'le cose.
Il numero di percorsi possibili sarà molto più grande del numero di percorsi considerati da un BFS, quindi non vedo come sarebbe utile. Un BFS combina ripetutamente percorsi simili che riducono la complessità. La complessità di un BFS è O (| V | + | E |). – fgb
Vuoi un elenco di tutti i percorsi o solo il numero di percorsi? Se vuoi il numero di percorsi, accontentarti di un'approssimazione? – user287792
Non voglio elencarli. Voglio calcolare il conteggio di loro senza contarli. –