【发布时间】:2015-04-07 07:54:23
【问题描述】:
您好,我有以下方法。它的作用是找到从 N x M 矩阵的左上角到右下角的所有可能路径。我想知道优化速度的最佳方法是什么,因为它现在有点慢。然后将生成的路径存储在一个集合中。
编辑我忘了澄清你只能向下或向右移动到相邻的位置,不能从你当前的位置对角线
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);
}
}
编辑这是完整的代码
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);
}
}
【问题讨论】:
-
真的是所有路径吗?因为在我看来,这包括循环和弯路。
-
这还不够,代码通常也不是问题,给我们展示所有代码。
-
我忘了说明你只能向下或向右移动到相邻的位置,不能从你当前的位置对角线
-
从您的代码看来,您只对向右或向下的路径感兴趣。代码或问题是错误的。请澄清!
-
据我了解,您正在尝试对矩阵进行排序。为什么不尝试 heapsort,因为它的复杂性最低。