Идея создать mat
прекрасна.Я бы не стал снимать первую и последнюю строку, так как на самом деле с ними будет легче работать, если вы их сохраните.Таким образом, ссылка на строку, такая как i-1
, не будет выходить за пределы диапазона, когда вы находитесь за пределами стены.
Я бы также не хранил там символы, такие как w
, но конкретные цифры, например -1 за стену, 0 бесплатно.Также сохраните 0 для «A» и «B».При встрече с этими двумя буквами вы можете сохранить их координаты в определенных переменных (например, rowA
, colA
, rowB
, colB
).Возможно, вам придется проверить, находится ли B внизу справа от A, так как в противном случае B определенно не будет доступен из A.
Поэтому я бы определил mat
следующим образом (обратите внимание, что я изменил размеры, потому что ваш второйВ примере показано, что в первой строке входных данных они расположены в указанном порядке):
int[][] mat = new int[Integer.valueOf(dimensions[1])]
[Integer.valueOf(dimensions[0])];
int colA = mat[0].length;
int rowA = 0;
int colB = colA;
int rowB = 0;
for (int i = 0; i < mat.length; i++) {
String currLine = lines.get(i+1);
int j = 0;
for (char c : currLine.toCharArray()) {
mat[i][j] = c == '*' ? -1 : 0;
if (c == 'B') {
if (colA > j) return 0; // B unreachable from A
rowB = i;
colB = j;
} else if (c == 'A') {
if (colB < j) return 0; // B unreachable from A
rowA = i;
colA = j;
}
j++;
}
}
При этой настройке вы можете повторно использовать mat
, чтобы сохранить количество путей от A до текущей позиции.Значение 0 в A
должно быть установлено в 1 (есть один путь от A до A), а затем необходимо сложить значение из ячейки сверху и слева, убедившись, что -1 рассматривается как0.
mat[rowA][colA] = 1;
for (int i = rowA; i <= rowB; i++) {
for (int j = colA; j <= colB; j++) {
if (mat[i][j] == 0) { // not a wall?
// count the number of paths that come from above,
// plus the number of paths that come from the left
mat[i][j] = Math.max(0, mat[i-1][j]) + Math.max(0, mat[i][j-1]);
}
}
}
return mat[rowB][colB]; // now this has the number of paths we are looking for
Хотя рекурсивный метод также будет работать, я бы предложил описанный выше подход динамическое программирование , поскольку таким образом вы избегаете повторного подсчета для определенной ячейки несколько раз (когдаприходя туда через разные пути DFS).Это решение имеет линейную сложность по времени.