Привет У меня есть следующий метод. Что он делает, так это найти все возможные пути от верхнего левого к нижнему праву матрицы N x M. Мне было интересно, что лучший способ оптимизировать его для скорости, поскольку сейчас он немного медленный. Приведенные пути затем сохраняются в наборе.Оптимизация алгоритма java
EDIT я забыл уточнить, вы можете двигаться только вниз или вправо на соседнюю точку, не диагонали от текущей позиции
For example
ABC
DEF
GHI
Путь от верхнего левого угла к нижнему правому не будет ADEFI
static public void printPaths (String tempString, int i, int j, int m, int n, char [][] arr, HashSet<String> palindrome) {
String newString = tempString + arr[i][j];
if (i == m -1 && j == n-1) {
palindrome.add(newString);
return;
}
//right
if (j+1 < n) {
printPaths (newString, i, j+1, m, n, arr, palindrome);
}
//down
if (i+1 < m) {
printPaths (newString, i+1, j, m, n, arr, palindrome);
}
}
EDIT Вот совокупность кода
public class palpath {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("palpath.in"));
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("palpath.out")));
StringTokenizer st = new StringTokenizer(br.readLine());
int d = Integer.parseInt(st.nextToken());
char[][] grid = new char [d][d];
String index = null;
for(int i = 0; i < d; i++)
{
String temp = br.readLine();
index = index + temp;
for(int j = 0; j < d; j++)
{
grid[i][j] = temp.charAt(j);
}
}
br.close();
int counter = 0;
HashSet<String> set = new HashSet<String>();
printPaths ("", 0, 0, grid.length, grid[0].length, grid, set);
Iterator<String> it = set.iterator();
while(it.hasNext()){
String temp = it.next();
StringBuilder sb = new StringBuilder(temp).reverse();
if(temp.equals(sb.toString())) {
counter++;
}
}
pw.println(counter);
pw.close();
}
static public void printPaths (String tempString, int i, int j, int m, int n, char [][] arr, HashSet<String> palindrome) {
String newString = tempString + arr[i][j];
if (i == m -1 && j == n-1) {
palindrome.add(newString);
return;
}
//right
if (j+1 < n) {
printPaths (newString, i, j+1, m, n, arr, palindrome);
}
//down
if (i+1 < m) {
printPaths (newString, i+1, j, m, n, arr, palindrome);
}
}
Действительно * все пути *? Потому что, на мой взгляд, это включает в себя петли и обходные пути. – dhke
Это не так, как правило, это тоже не проблема, покажите нам весь код. – marko5049
Я забыл прояснить, что вы можете перемещаться только вниз или вправо к соседнему месту, без диагонали от вашей текущей позиции. –