作爲一種實踐,我試圖解決這個problem on topcoder,我試着爲它實現DFS解決方案,除了一個bug之外它運行良好:即使它到達死衚衕,它仍然遍歷每個未訪問的單元中,初始碼是:簡單的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;'。 – irrelephant
我只想當它到達死衚衕時停下來,不去探索另一個單元格,所以不需要回溯我猜 –
嘗試沒有StringBuilder並傳遞常規字符串。您可能還需要返回String。 – irrelephant