Boggle (Find all possible words in a board of characters) | Set 1 - GeeksforGeeks

27 Sep, 2021
Given a dictionary, a method to do lookup in dictionary and a M x N board where every cell has one character. Find all possible words that can be formed by a sequence of adjacent characters. Note that we can move to any of 8 adjacent characters, but a word should not have multiple instances of same cell.Example:  
Input: dictionary[] = {"GEEKS", "FOR", "QUIZ", "GO"};
       boggle[][]   = {{'G', 'I', 'Z'},
                       {'U', 'E', 'K'},
                       {'Q', 'S', 'E'}};
      isWord(str): returns true if str is present in dictionary
                   else false.

Output:  Following words of dictionary are present
         GEEKS
         QUIZ
 
 
The idea is to consider every character as a starting character and find all words starting with it. All words starting from a character can be found using Depth First Traversal. We do depth first traversal starting from every cell. We keep track of visited cells to make sure that a cell is considered only once in a word. 
C++
Java
Python3
C#
Javascript
// C++ program for Boggle game#include <cstring>#include <iostream>using namespace std; #define M 3#define N 3 // Let the given dictionary be followingstring dictionary[] = { "GEEKS", "FOR", "QUIZ", "GO" };int n = sizeof(dictionary) / sizeof(dictionary[0]); // A given function to check if a given string is present in// dictionary. The implementation is naive for simplicity. As// per the question dictionary is given to us.bool isWord(string& str){    // Linearly search all words    for (int i = 0; i < n; i++)        if (str.compare(dictionary[i]) == 0)            return true;    return false;} // A recursive function to print all words present on bogglevoid findWordsUtil(char boggle[M][N], bool visited[M][N], int i,                   int j, string& str){    // Mark current cell as visited and append current character    // to str    visited[i][j] = true;    str = str + boggle[i][j];     // If str is present in dictionary, then print it    if (isWord(str))        cout << str << endl;     // Traverse 8 adjacent cells of boggle[i][j]    for (int row = i - 1; row <= i + 1 && row < M; row++)        for (int col = j - 1; col <= j + 1 && col < N; col++)            if (row >= 0 && col >= 0 && !visited[row][col])                findWordsUtil(boggle, visited, row, col, str);     // Erase current character from string and mark visited    // of current cell as false    str.erase(str.length() - 1);    visited[i][j] = false;} // Prints all words present in dictionary.void findWords(char boggle[M][N]){    // Mark all characters as not visited    bool visited[M][N] = { { false } };     // Initialize current string    string str = "";     // Consider every character and look for all words    // starting with this character    for (int i = 0; i < M; i++)        for (int j = 0; j < N; j++)            findWordsUtil(boggle, visited, i, j, str);} // Driver program to test above functionint main(){    char boggle[M][N] = { { 'G', 'I', 'Z' },                          { 'U', 'E', 'K' },                          { 'Q', 'S', 'E' } };     cout << "Following words of dictionary are present\n";    findWords(boggle);    return 0;}
// Java program for Boggle gameclass GFG {    // Let the given dictionary be following    static final String dictionary[] = { "GEEKS", "FOR", "QUIZ", "GUQ", "EE" };    static final int n = dictionary.length;    static final int M = 3, N = 3;     // A given function to check if a given string is present in    // dictionary. The implementation is naive for simplicity. As    // per the question dictionary is given to us.    static boolean isWord(String str)    {        // Linearly search all words        for (int i = 0; i < n; i++)            if (str.equals(dictionary[i]))                return true;        return false;    }     // A recursive function to print all words present on boggle    static void findWordsUtil(char boggle[][], boolean visited[][], int i,                              int j, String str)    {        // Mark current cell as visited and append current character        // to str        visited[i][j] = true;        str = str + boggle[i][j];         // If str is present in dictionary, then print it        if (isWord(str))            System.out.println(str);         // Traverse 8 adjacent cells of boggle[i][j]        for (int row = i - 1; row <= i + 1 && row < M; row++)            for (int col = j - 1; col <= j + 1 && col < N; col++)                if (row >= 0 && col >= 0 && !visited[row][col])                    findWordsUtil(boggle, visited, row, col, str);         // Erase current character from string and mark visited        // of current cell as false        str = "" + str.charAt(str.length() - 1);        visited[i][j] = false;    }     // Prints all words present in dictionary.    static void findWords(char boggle[][])    {        // Mark all characters as not visited        boolean visited[][] = new boolean[M][N];         // Initialize current string        String str = "";         // Consider every character and look for all words        // starting with this character        for (int i = 0; i < M; i++)            for (int j = 0; j < N; j++)                findWordsUtil(boggle, visited, i, j, str);    }     // Driver program to test above function    public static void main(String args[])    {        char boggle[][] = { { 'G', 'I', 'Z' },                            { 'U', 'E', 'K' },                            { 'Q', 'S', 'E' } };         System.out.println("Following words of dictionary are present");        findWords(boggle);    }}
# Python3 program for Boggle game# Let the given dictionary be following dictionary = ["GEEKS", "FOR", "QUIZ", "GO"]n = len(dictionary)M = 3N = 3 # A given function to check if a given string# is present in dictionary. The implementation is# naive for simplicity. As per the question# dictionary is given to us.def isWord(Str):       # Linearly search all words    for i in range(n):        if (Str == dictionary[i]):            return True    return False # A recursive function to print all words present on boggledef findWordsUtil(boggle, visited, i, j, Str):    # Mark current cell as visited and    # append current character to str    visited[i][j] = True    Str = Str + boggle[i][j]         # If str is present in dictionary,    # then print it    if (isWord(Str)):        print(Str)         # Traverse 8 adjacent cells of boggle[i,j]    row = i - 1    while row <= i + 1 and row < M:        col = j - 1        while col <= j + 1 and col < N:            if (row >= 0 and col >= 0 and not visited[row][col]):                findWordsUtil(boggle, visited, row, col, Str)            col+=1        row+=1         # Erase current character from string and    # mark visited of current cell as false    Str = "" + Str[-1]    visited[i][j] = False # Prints all words present in dictionary.def findWords(boggle):       # Mark all characters as not visited    visited = [[False for i in range(N)] for j in range(M)]         # Initialize current string    Str = ""         # Consider every character and look for all words    # starting with this character    for i in range(M):      for j in range(N):        findWordsUtil(boggle, visited, i, j, Str) # Driver Codeboggle = [["G", "I", "Z"], ["U", "E", "K"], ["Q", "S", "E"]] print("Following words of", "dictionary are present")findWords(boggle) #  This code is contributed by divyesh072019.
// C# program for Boggle gameusing System;using System.Collections.Generic; class GFG{    // Let the given dictionary be following    static readonly String []dictionary = { "GEEKS", "FOR",                                            "QUIZ", "GUQ", "EE" };    static readonly int n = dictionary.Length;    static readonly int M = 3, N = 3;     // A given function to check if a given string    // is present in dictionary. The implementation is    // naive for simplicity. As per the question    // dictionary is given to us.    static bool isWord(String str)    {        // Linearly search all words        for (int i = 0; i < n; i++)            if (str.Equals(dictionary[i]))                return true;        return false;    }     // A recursive function to print all words present on boggle    static void findWordsUtil(char [,]boggle, bool [,]visited,                              int i, int j, String str)    {        // Mark current cell as visited and        // append current character to str        visited[i, j] = true;        str = str + boggle[i, j];         // If str is present in dictionary,        // then print it        if (isWord(str))            Console.WriteLine(str);         // Traverse 8 adjacent cells of boggle[i,j]        for (int row = i - 1; row <= i + 1 && row < M; row++)            for (int col = j - 1; col <= j + 1 && col < N; col++)                if (row >= 0 && col >= 0 && !visited[row, col])                    findWordsUtil(boggle, visited, row, col, str);         // Erase current character from string and        // mark visited of current cell as false        str = "" + str[str.Length - 1];        visited[i, j] = false;    }     // Prints all words present in dictionary.    static void findWords(char [,]boggle)    {        // Mark all characters as not visited        bool [,]visited = new bool[M, N];         // Initialize current string        String str = "";         // Consider every character and look for all words        // starting with this character        for (int i = 0; i < M; i++)            for (int j = 0; j < N; j++)                findWordsUtil(boggle, visited, i, j, str);    }     // Driver Code    public static void Main(String []args)    {        char [,]boggle = { { 'G', 'I', 'Z' },                           { 'U', 'E', 'K' },                           { 'Q', 'S', 'E' } };         Console.WriteLine("Following words of " +                           "dictionary are present");        findWords(boggle);    }} // This code is contributed by PrinciRaj1992
<script>      // JavaScript program for Boggle game      // Let the given dictionary be following      var dictionary = ["GEEKS", "FOR", "QUIZ", "GO"];      var n = dictionary.length;      var M = 3,        N = 3;       // A given function to check if a given string      // is present in dictionary. The implementation is      // naive for simplicity. As per the question      // dictionary is given to us.      function isWord(str)      {               // Linearly search all words        for (var i = 0; i < n; i++) if (str == dictionary[i]) return true;        return false;      }       // A recursive function to print all words present on boggle      function findWordsUtil(boggle, visited, i, j, str)      {               // Mark current cell as visited and        // append current character to str        visited[i][j] = true;        str = str + boggle[i][j];         // If str is present in dictionary,        // then print it        if (isWord(str)) document.write(str + "<br>");         // Traverse 8 adjacent cells of boggle[i,j]        for (var row = i - 1; row <= i + 1 && row < M; row++)          for (var col = j - 1; col <= j + 1 && col < N; col++)            if (row >= 0 && col >= 0 && !visited[row][col])              findWordsUtil(boggle, visited, row, col, str);         // Erase current character from string and        // mark visited of current cell as false        str = "" + str[str.length - 1];        visited[i][j] = false;      }       // Prints all words present in dictionary.      function findWords(boggle)      {               // Mark all characters as not visited        var visited = Array.from(Array(M), () => new Array(N).fill(0));         // Initialize current string        var str = "";         // Consider every character and look for all words        // starting with this character        for (var i = 0; i < M; i++)          for (var j = 0; j < N; j++) findWordsUtil(boggle, visited, i, j, str);      }       // Driver Code      var boggle = [        ["G", "I", "Z"],        ["U", "E", "K"],        ["Q", "S", "E"],      ];       document.write("Following words of " + "dictionary are present <br>");      findWords(boggle);             // This code is contributed by rdtank.    </script>
Following words of dictionary are present
GEEKS
QUIZ
Note that the above solution may print the same word multiple times. For example, if we add “SEEK” to the dictionary, it is printed multiple times. To avoid this, we can use hashing to keep track of all printed words.In below set 2, we have discussed Trie based optimized solution: Boggle | Set 2 (Using Trie)This article is contributed by Rishabh. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
ShubhamRathi1
AbhinayJha
princiraj1992
rdtank
divyesh072019
Algorithms-Backtracking
Amazon
DFS
Graph
Amazon
DFS
Graph
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Topological Sorting
Detect Cycle in a Directed Graph
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Disjoint Set (Or Union-Find) | Set 1 (Detect Cycle in an Undirected Graph)
Detect cycle in an undirected graph
Ford-Fulkerson Algorithm for Maximum Flow Problem
Traveling Salesman Problem (TSP) Implementation
Strongly Connected Components