c_cpp 给定一个2D板和一个单词,找出该单词是否存在于网格中。该单词可以由顺序相邻的单元格的字母w构成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定一个2D板和一个单词,找出该单词是否存在于网格中。该单词可以由顺序相邻的单元格的字母w构成相关的知识,希望对你有一定的参考价值。

http://exceptional-code.blogspot.com/2012/02/solving-boggle-game-recursion-prefix.html

http://stackoverflow.com/questions/746082/how-to-find-list-of-possible-words-from-a-letter-matrix-boggle-solver


solution 1: dfs
solution 2: dfs + trie
solution 3: dp


typedef vector<vector<char>> board;
typedef vector<vector<bool>> flag;

bool is_word_exist_in_board(board &bd, string word) {
    if(word.empty()) return false;
    int m = bd.size(), n = bd[0].size();
    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            if(bd[i][j] == word[0]) {              // gist, compare first letter
                flag visited(m, vector<bool>(n, false));  // in each compare, create a new flag matrix
                if (judge(bd, word, 0, i, j, visited) == true) 
                    return true;
            }
        }
    }
    return false;
}

bool judge(board &bd, string word, int idx, int i, int j, flag &visited) {
    if(!valid(bd, i, j) || visited[i][j] || bd[i][j] != word[idx]) return false; // note the 3rd predicate, note their orders of all 3 predicates
    if(idx == word.size()-1) return true;
    visited[i][j] = true;
    bool found = judge(bd, word, idx+1, i+1, j, visited) 
    ||judge(bd, word, idx+1, i-1, j, visited) 
    ||judge(bd, word, idx+1, i, j+1, visited) 
    || judge(bd, word, idx+1, i, j-1, visited);

    visited[i][j] = false;  // gist, easy to forget!
    return found; // necessary
}

bool valid(board &bd, int i, int j) {
    int m = bd.size(), n = bd[0].size();
    return (0 <= i && i < m && 0 <= j && j < n);
}

以上是关于c_cpp 给定一个2D板和一个单词,找出该单词是否存在于网格中。该单词可以由顺序相邻的单元格的字母w构成的主要内容,如果未能解决你的问题,请参考以下文章

矩阵leetcode解决方案中的单词搜索不起作用

使用回溯(而不是 DFS)背后的直觉

2022-01-23:力扣425,单词方块。 给定一个单词集合 (没有重复),找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < m

单词搜索

79. 单词搜索

Leetcode 79.单词搜索