私は Coursera のアルゴリズム、パート IIコースに登録しました。課題の 1 つは、ボーグル ゲームを解くことです: http://coursera.cs.princeton.edu/algs4/assignments/boggle.html
名誉規定では、解決策を公に投稿しないことが求められているため、代わりに基本アルゴリズムの疑似コードを次に示します。
visit:
word <- board[i][j]
start <- dictionary.match(word, start)
if start is not null
visited[i][j] <- true
word <- prefix + word
if word is longer than min required length
words <- words + word
for (x, y) ∊ adj(i, j)
if not visited(x, y)
visit (x, y)
visited[i][j] <- false
ディクショナリは Trie を使用して実装されます。
上記のコードは機能し、私は割り当てに合格しましたが、動的プログラミングを使用したより高速なソリューションを主張する次のブログ投稿に出くわしました。
気の利いた動的計画法を使用して、単語 (この場合は辞書から) をボードから構築できるかどうかをすばやく確認できます。
動的計画法の考え方の要点は次のとおりです。
ボードの [i, j] 番目の位置 (終了位置) で長さ k の単語が見つかるには、その単語の k-1 番目の文字が [i, j] の隣接するセルの 1 つに配置されている必要があります。 j].
基本ケースは k = 1 です。
長さ 1 の文字は、ボードの [i, j] 番目のセルで見つかります (終了位置)。単語内の唯一の文字は、ボードの [i, j] 番目の位置の文字と一致します。
動的計画法テーブルに基本ケースが入力されると、その上に長さ k (k > 1) の任意の単語を構築できます。
残念ながら、著者の説明は不十分であり、私は彼の解決策をたどることができません。私はしたいのですが、ここの誰かが私にそれを説明してくれることを願っています.
PS:
DPを使用していないため、この質問の複製ではありません。それらの重複した幸せな指を抑えてください。
私の側では十分な努力が示されており、誰にも宿題をするように頼むことはありません. 私はすでに独自の解決策を持っています。私が興味を持っているのは、問題を解決するためのより良い方法があればそれを学ぶことです。
ありがとう!