解決策ではありませんが、このアイデアをもう少し考えてみてください。問題は、すべてのパスを取得するために、可能な限り長いパスも計算する必要があることです。最長パスの問題は、一般的なグラフのNP完全問題であるため、比較的小さなグラフ(8x8以上)でも非常に長い時間がかかります。
開始頂点がマトリックスの左上隅にあり、終了頂点がマトリックスの右下隅にあると想像してください。
- 1x2マトリックスの場合、可能なパスは1つだけです。
- 2x2マトリックス=>2***1**パス=>2
- 3x2マトリックス=>2***2**パス=>4
- 3x3マトリックス=>2*** 4 ** + 2*2パス=>12
- 3x4マトリックス=>2*** 12 ** + 12+2パス=>38
毎回、現在のパス数について前回の計算結果を組み合わせました。そのような平面グラフの厳密な定式化が存在する可能性があります。おそらくそれについては多くの理論がありますが、私はそれに対して愚かすぎます...
次のJava(申し訳ありませんが、私はc ++の専門家ではありません:-/)スニペットを使用して、より大きな行列の可能なパスを計算できます。
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 => 1262816
- 7x7(この単純なケースでもかなりの時間がかかります!)=> 575780564
これは、(理論的にのみ)MxMマトリックスの任意の位置から右下隅までのすべての可能なパスを計算し、このマトリックスを使用してパスの数をすばやく検索できることを意味します。動的計画法(以前の計算結果を使用)は、物事を少しスピードアップする可能性があります。