📌  相关文章
📜  检查是否可以使用矩阵的相邻单元格的字符形成给定的字符串

📅  最后修改于: 2021-04-29 08:15:48             🧑  作者: Mango

给定一个由字符的矩阵和一个字符串Word ,任务是检查在仅由水平和垂直相邻的字符序列构成的板上是否存在Word 。每个字符只能使用一次。
例子:

方法:解决此问题的方法是遍历矩阵中的所有字符并查找单词第一个字符的出现。只要找到,就递归地继续检查其相邻的水平和垂直单元格是否存在下一个字符。重复此过程,直到找到所有字符。找到所有字符匹配表示Word的任何实例。如果没有发生这种情况,则找不到Word
下面是上述逻辑的实现:

C++
// C++ Program to check if a given
// word can be formed from the
// adjacent characters in a matrix
// of characters
 
#include 
using namespace std;
 
// Function to check if the word exists
bool checkWord(vector >& board,
               string& word, int index,
               int row, int col)
{
    // If index exceeds board range
    if (row < 0 || col < 0
        || row >= board.size()
        || col >= board[0].size())
        return false;
 
    // If the current cell does not
    // contain the required character
    if (board[row][col] != word[index])
        return false;
 
    // If the cell contains the required
    // character and is the last character
    // of the word required to be matched
    else if (index == word.size() - 1)
 
        // Return true as word is found
        return true;
 
    char temp = board[row][col];
 
    // Mark cell visited
    board[row][col] = '*';
 
    // Check Adjacent cells
    // for the next character
    if (checkWord(board, word,
                  index + 1, row + 1, col)
        || checkWord(board, word,
                     index + 1, row - 1, col)
        || checkWord(board, word,
                     index + 1, row, col + 1)
        || checkWord(board, word,
                     index + 1, row, col - 1)) {
 
        board[row][col] = temp;
 
        return true;
    }
 
    // Restore cell value
    board[row][col] = temp;
    return false;
}
 
// Driver Code
int main()
{
    vector > board
        = { { 'A', 'B', 'C', 'E' },
            { 'S', 'F', 'C', 'S' },
            { 'A', 'D', 'E', 'E' } };
    string word = "CFDASABCESEE";
 
    for (int i = 0; i < board.size(); i++) {
        for (int j = 0; j < board[0].size(); j++) {
 
            if (board[i][j] == word[0]
                && checkWord(
                       board, word,
                       0, i, j)) {
 
                cout << "True" << '\n';
                return 0;
            }
        }
    }
    cout << "False" << '\n';
    return 0;
}


Java
// Java Program to check if a given
// word can be formed from the
// adjacent characters in a matrix
// of characters
import java.util.*;
class GFG{
 
// Function to check if the word exists
static boolean checkWord(char [][]board,
                 String word, int index,
                       int row, int col)
{
    // If index exceeds board range
    if (row < 0 || col < 0 ||
        row >= board.length ||
        col >= board[0].length)
        return false;
 
    // If the current cell does not
    // contain the required character
    if (board[row][col] != word.charAt(index))
        return false;
 
    // If the cell contains the required
    // character and is the last character
    // of the word required to be matched
    else if (index == word.length() - 1)
 
        // Return true as word is found
        return true;
 
    char temp = board[row][col];
 
    // Mark cell visited
    board[row][col] = '*';
 
    // Check Adjacent cells
    // for the next character
    if (checkWord(board, word,
                  index + 1, row + 1, col) ||
        checkWord(board, word,
                  index + 1, row - 1, col) ||
        checkWord(board, word,
                  index + 1, row, col + 1) ||
        checkWord(board, word,
                  index + 1, row, col - 1))
    {
        board[row][col] = temp;
 
        return true;
    }
 
    // Restore cell value
    board[row][col] = temp;
    return false;
}
 
// Driver Code
public static void main(String[] args)
{
    char[][] board = { { 'A', 'B', 'C', 'E' },
                       { 'S', 'F', 'C', 'S' },
                       { 'A', 'D', 'E', 'E' } };
    String word = "CFDASABCESEE";
 
    for (int i = 0; i < board.length; i++)
    {
        for (int j = 0; j < board[0].length; j++)
        {
            if (board[i][j] == word.charAt(0) &&
                checkWord(board, word, 0, i, j))
            {
                System.out.println("True");
                return;
            }
        }
    }
    System.out.println("False");
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python 3 Program to check if a given
# word can be formed from the
# adjacent characters in a matrix
# of characters
 
# Function to check if
# the word exists
def checkWord(board, word,
              index, row, col):
 
    # If index exceeds board range
    if (row < 0 or col < 0 or
        row >= len(board) or
        col >= len(board[0])):
        return False
 
    # If the current cell does not
    # contain the required character
    if (board[row][col] != word[index]):
        return False
 
    # If the cell contains the required
    #character and is the last character
    # of the word required to be matched
    elif (index == len(word) - 1):
 
        # Return true as word is found
        return True
 
    temp = board[row][col]
 
    # Mark cell visited
    board[row][col] = '*'
 
    # Check Adjacent cells
    # for the next character
    if (checkWord(board, word,
                  index + 1,
                  row + 1, col) or
        checkWord(board, word,
                  index + 1,
                  row - 1, col) or
        checkWord(board, word,
                  index + 1,
                  row, col + 1) or
        checkWord(board, word,
                  index + 1,
                  row, col - 1)):
        board[row][col] = temp
        return True
    
    # Restore cell value
    board[row][col] = temp
    return False
 
# Driver Code
if __name__ == "__main__":
 
    board = [['A', 'B', 'C', 'E'],
            ['S', 'F', 'C', 'S'],
            ['A', 'D', 'E', 'E']]
    word = "CFDASABCESEE"
    f = 0
     
    for i in range (len(board)):
        for j in range (len(board[0])):
            if (board[i][j] == word[0] and
                checkWord(board, word,
                          0, i, j)):
                print ("True" )
                f = 1
                break
        if f == 1:
          break
           
    if f == 0:
       print ("False")
 
# This code is contributed by Chitranayal


C#
// C# program to check if a given word
// can be formed from the adjacent
// characters in a matrix of characters
using System;
 
class GFG{
 
// Function to check if the word exists
static bool checkWord(char [,]board, String word,
                      int index, int row, int col)
{
     
    // If index exceeds board range
    if (row < 0 || col < 0 ||
        row >= board.GetLength(0) ||
        col >= board.GetLength(1))
        return false;
 
    // If the current cell does not
    // contain the required character
    if (board[row, col] != word[index])
        return false;
 
    // If the cell contains the required
    // character and is the last character
    // of the word required to be matched
    else if (index == word.Length - 1)
 
        // Return true as word is found
        return true;
 
    char temp = board[row, col];
 
    // Mark cell visited
    board[row, col] = '*';
 
    // Check adjacent cells
    // for the next character
    if (checkWord(board, word,
                  index + 1, row + 1, col) ||
        checkWord(board, word,
                  index + 1, row - 1, col) ||
        checkWord(board, word,
                  index + 1, row, col + 1) ||
        checkWord(board, word,
                  index + 1, row, col - 1))
    {
        board[row, col] = temp;
 
        return true;
    }
 
    // Restore cell value
    board[row, col] = temp;
    return false;
}
 
// Driver Code
public static void Main(String[] args)
{
    char[,] board = { { 'A', 'B', 'C', 'E' },
                      { 'S', 'F', 'C', 'S' },
                      { 'A', 'D', 'E', 'E' } };
    String word = "CFDASABCESEE";
 
    for(int i = 0; i < board.GetLength(0); i++)
    {
       for(int j = 0; j < board.GetLength(1); j++)
       {
          if (board[i, j] == word[0] &&
              checkWord(board, word, 0, i, j))
          {
              Console.WriteLine("True");
              return;
          }
       }
    }
    Console.WriteLine("False");
}
}
 
// This code is contributed by Rajput-Ji


输出:
True