一種方法是:
for each path on the board
if corresponding word in dictionary
print it
要找到所有的路徑,你可以適應任何graph traversal algorithm。
現在這將會非常緩慢,因爲有一個大小很大的板子的路徑(對於有n個單元的板子,我們最多可以有n * 4^(n - 1)
路徑,所以對於5x5板子,有一些像25 * 2^50 = = 10^16路徑
改進的一種方法是交叉遍歷圖和檢查字典,如果當前路徑的單詞不是字典單詞的前綴,則中止:。
class Board {
char[][] ch;
boolean[][] visited;
Trie dictionary;
void find() {
StringBuilder prefix = new StringBuilder();
for (int x = 0; x < maxx; x++) {
for (int y = 0; y < maxy; y++) {
walk(x, y, prefix);
}
}
}
void walk(int x, int y, StringBuilder prefix) {
if (!visited[x][y]) {
visited[x][y] = true;
prefix.append(ch[x][y]);
if (dictionary.hasPrefix(prefix)) {
if (dictionary.contains(prefix)) {
System.out.println(prefix);
}
int firstX = Math.max(0, x - 1);
int lastX = Math.min(maxx, x + 1);
int firstY = Math.max(0, y - 1);
int lastY = Math.min(maxy, y + 1);
for (int ax = firstX; ax <= lastX; ax++) {
for (int ay = firstY; ay <= lastY; ay++) {
walk(ax, ay, prefix);
}
}
}
prefix.setLength(prefix.length() - 1);
visited[x][y] = false;
}
}
正如你所看到的,方法調用散步本身這種技術被稱爲recursion
這就爲尋找支持有效前綴查詢的字典的數據結構留下了一個問題。最好的這種數據結構是Trie。唉,JDK不包含實現,但幸運的是,編寫一個並不難。
注意:此答案中的代碼尚未經過測試。
你是什麼意思與「在板上產生的話」?你的輸入是什麼,它的輸出是什麼? – meriton
該應用程序在隨機基礎上(隨機字符)生成板,然後必須在多個方向上(水平,垂直和對角線)找到板上所有可能的單詞,並且可能不會訪問兩次角色。 – user1929899
「多個方向」是什麼意思?單個單詞可以使用多個方向,即單詞必須是直線還是曲線可以在整個板上? – meriton