【发布时间】:2012-08-22 08:23:53
【问题描述】:
我正在尝试解决这个problem on topcoder 作为一种实践,我尝试为它实现 DFS 解决方案,它运行良好,除了一个错误:它会不断遍历每个未访问的单元格,即使它到达死胡同,初始代码是:
public void func(int[][] x, StringBuilder s, int i, int j, int n) {
if (i < 0 || j < 0 || i > n || j > n || x[i][j] == 1) {
return;
}
s.append((char) (97 + j));
s.append(n - i + 1 + "-");
x[i][j] = 1;
func(x, s, i, j + 1, n);
func(x, s, i - 1, j, n);
func(x, s, i + 1, j, n);
func(x, s, i, j - 1, n);
return;
}
public String dukePath(int n, String initPosition) {
String p = initPosition;
int x[][] = new int[n][n];
StringBuilder s = new StringBuilder("");
func(x, s, n - Integer.parseInt(p.charAt(1) + ""), (int) p.charAt(0) - 97, n - 1);
s.replace(s.length() - 1, s.length(), "");
if (s.length() > 40) {
s.replace(20, s.length() - 20, "...");
}
return s.toString();
}
所以我尝试通过添加一个布尔标志和初始位置 (z,y) 来修改函数“func()”的签名,以将当前单元格与 ;如果代码尝试重新访问初始位置,那么它应该返回,但它也没有工作..
当再次到达死路或初始位置时,如何停止遍历?
【问题讨论】:
-
当你到达死胡同时,你正在标记
x[i][j] = 1;,但当你回溯时,你并没有将它标记为未访问x[i][j] = 0;。 -
我只是希望它在到达死胡同时停止,而不是探索另一个单元格,所以我想不需要回溯
-
尝试不使用 StringBuilder 并传递常规字符串。您可能还需要返回 String。
-
@a.u.r 你说的“死胡同”是什么意思?目前你总是检查所有四个相邻的位置......
-
@veredesmarald 我的意思是到达所有相邻单元格都被访问的位置
标签: java algorithm depth-first-search