段階的な問題への私のアプローチは次のとおりです。
パズルで特定の単語を見つけてみてください: DFS を使用して、パズルで単語を見つけることができます。すべての行と列の文字を反復処理する必要があるため、これは O(n^2) になります。
パズルで指定されたすべての単語を見つける: x 個の単語が指定されている場合、すべての単語に対して上記のアルゴリズムを使用できます。複雑さは O(x*n^2) になります。
同じ接頭辞を持つ単語がある場合、接頭辞を検索するために行われた作業を繰り返します。これは、与えられた単語のトライ構造を構築し、トライの DFS とパズルの DFS を組み合わせることで回避できます。
以下は、C++ での最初のステップの大まかな実装です。
bool FindWordInPuzzle(int i, int j, char nextChar, int nextCharId, string word, int m, int n, bool **mark, char **maze)
{
int move[8][2] = { 0, -1, -1, -1, -1, 0, -1, 1, 0, 1, 1, 1, 1, 0, 1, -1 };
mark[i][j] = 1;
for (int r = 0; r < 8; r++) {
int g = i + move[r][0];
int h = j + move[r][1];
if (g > 0 && g < m + 2 && h > 0 && h < m + 2 && mark[g][h] == 0 && maze[g][h] == nextChar) {
nextCharId++;
if (nextCharId >= word.length()) {
return true;
}
if (FindWordInPuzzle(g, h, word[nextCharId], nextCharId, word, m, n, mark, maze)) {
return true;
}
}
}
return false;
}
bool FindWord(char **maze, bool **mark, int m, int n, string word) {
char currentChar = word[0];
int currentCharId = 0;
for (int row = 1; row < m + 2; row++) {
for (int col = 1; col < n+2; col++) {
if (maze[row][col] == currentChar && mark[row][col] == 0) {
currentCharId++;
if (currentCharId >= word.length()) {
return true;
}
if (FindWordInPuzzle(row, col, word[currentCharId], currentCharId, word, m, n, mark, maze)) {
return true;
}
}
currentCharId = 0;
currentChar = word[0];
}
}
return false;
}
int main() {
string word;
int m, n;
cin >> word;
if (word.length() <= 0) return 0;
cin >> m >> n;
char** maze;
bool **mark;
// declare arrays
maze = new char*[m + 2];
mark = new bool*[m + 2];
for (int i = 0; i < m + 2; i++) {
maze[i] = new char[n + 2];
mark[i] = new bool[n + 2];
}
// boundaries
for (int i = 0; i < m + 2; i++) {
maze[0][i] = ' ';
maze[i][0] = ' ';
maze[0][m + 1] = ' ';
maze[i][m + 1] = ' ';
mark[0][i] = 1;
mark[i][0] = 1;
mark[0][m + 1] = 1;
mark[i][m + 1] = 1;
}
// get values
for (int i = 1; i < m + 1; i++) {
for (int j = 1; j < n + 1; j++) {
cin >> maze[i][j];
mark[i][j] = 0;
}
}
bool val = FindWord(maze, mark, m, n, word);
cout << val;
cin >> word;
return 0;
}