単語がグリッドに存在するかどうかを調べるために、二次元のグリッドと言葉を与えられました。
単語、隣接するセル内の文字のアルファベット順に構成する必要があり、水平方向または垂直方向に隣接するセルに隣接している「隣接」セル。同じセル内の文字を再利用することを許可されていません。
例:
ボード=
[
[ 'A'、 'B'、 'C'、 'E']、
[ 'S'、 'F'、 'C'、 'S']、
[ 'A'、 'D'、E ' 」、 'E']
]
与えられた単語= "ABCCEDは"、trueを返します。
単語= "SEE"を考えると、trueを返します。
単語= "ABCB"を考えると、falseを返します。
タイトルは+バック十分、実際にはDFS非常に単純な主題ですが、実行している時間のバージョンの初めには、3つのサンプルのタイムアウトの存在下で、常に次のとおりです。
クラスのソリューション{ パブリック: 存在しBOOL(ベクトル<ベクトル<文字>>&ボード、文字列の単語){ 場合(word.size()== 0) falseを返します。 用(INT列= 0、行<board.size();行++) { ための(int型COL = 0、COL <ボード[行] .size(); COL ++) { IF(コア(ボード、ワード、0、行、COL)) trueを返します。 } } falseを返します。 } ブールコア(ベクトル<ベクトル<チャー>>&辞書、文字列の単語、int型のPOS、INT列、int型COL) { (posが== word.size())場合に trueを返します。 IF(行<0 ||行> = dict.size()|| COL <0 || COL> =辞書[行] .size() ||辞書[行] [COL]!=ワード[POS]) リターン偽; 辞書[行] [COL] =」 IF(コア(辞書、単語、POS + 1、行1、列)||コア(辞書、単語、POS + 1、行+ 1、COL) ||コア(辞書、単語、POS + 1、行、 COL-1)||コア(辞書、単語、POS + 1、行、列+ 1))が trueを返します。 falseを返します。 } }。
たびに、我々は再構築を渡すので、代わりに元の行列の行列のコピーを変更、実際の各時間伝達行列に渡されたパラメータの特性値に依存しているバックトラックのこのバージョンは、また、タイムアウトにつながりました行列。
以下のバージョンが変更され、バックに変更を使用した後に自分自身を保存するために、一時的な変数の使用に依存しているバックトラック、通過参照を使用します。
クラスのソリューション{ パブリック: 存在しBOOL(ベクトル<ベクトル<文字>>&ボード、文字列の単語){ 場合(word.size()== 0) falseを返します。 用(INT列= 0、行<board.size();行++) { ための(int型COL = 0、COL <ボード[行] .size(); COL ++) { IF(コア(ボード、ワード、0、行、COL)) trueを返します。 } } falseを返します。 } ブールコア(ベクトル<ベクトル<チャー>>&辞書、文字列&ワード、int型のPOS、INT列、int型COL) { 場合(posが== word.size()) trueを返します。 IF(行<0 ||行> = dict.size()|| COL <0 || COL> =辞書[行] .size() ||辞書[行] [COL]!=ワード[POS]) リターン偽; IF(コア(辞書、単語、POS + 1、行1、列)||コア(辞書、単語、POS + 1、行+ 1、COL) ||コア(辞書、単語、POS + 1、行、 COL-1)||コア(辞書、単語、POS + 1、行、列+ 1))が trueを返します。 辞書[行] [COL] = TMP。 falseを返します。 } }。
辞書と単語の後、時間の複雑さの99%を超えて、参照を渡すことで使用され、元のサンプルは、サンプルのタイムアウトを持っています。
話題のこの非常に複雑で、参照によって使用パスは本当に重要です