/*
An alphabet can be used only in one of the word.
If any cell of matrix constitutes to any word, I have replaced the character with a '*'
*/
#include <iostream>
#include <sstream>
using namespace std;
const int DIM = 3;
const int MAXNEIGHBOURS = 8;
int displacement[8][2] = {{-1,-1},{0,-1},{1,-1},{1,0},{-1,1},{0,1},{-1,1},{-1,0}};
char matrix[DIM][DIM] = {{'c','a','t'},{'a','j','i'},{'t','n','o'}};
void displayMatrix();
bool isValid(int row, int col)
{
if(row<0 || col <0 || row >= DIM || col >= DIM)
return false;
if(matrix[row][col] == '*')
return false;
return true;
}
bool solveMatrix(int row,int col, string word)
{
if(word.compare("*") ==0)
return false;
if(dictionary.search(word))
{
cout<<"\n"<<word;
matrix[row][col] = '*';
return true;
}
for(int i=0; i<MAXNEIGHBOURS ; i++)
{
int newRow = row + displacement[i][0];
int newCol = col + displacement[i][1];
char originalCharacter = matrix[row][col];
matrix[row][col] = '*';
if(isValid(newRow,newCol))
{
if(solveMatrix(newRow,newCol,word+matrix[newRow][newCol]))
return true;
}
matrix[row][col] = originalCharacter;
}
return false;
}
string toString(char ch)
{
stringstream ss;
string s;
ss<<ch;
ss>>s;
return s;
}
int main()
{
dictionary.insert("hello");
dictionary.insert("cat");
dictionary.insert("in");
dictionary.insert("no");
dictionary.insert("at");
for(int i=0; i<DIM; i++)
for(int j=0; j<DIM; j++)
solveMatrix(i,j,toString(matrix[i][j]));
cout<<endl;
system("pause");
}
/*
I have used TRIE to store dictionary below is the implentation of it.
*/
class TRIENode
{
public:
bool word;
int prefixCount;
TRIENode *child[26];
TRIENode()
{
word = false;
prefixCount = 0;
for(int i=0; i<26; i++)
child[i] = NULL;
}
bool isWord()
{
return word;
}
};
class TRIE
{
private:
TRIENode *headNode;
public:
TRIE()
{
headNode = new TRIENode();
}
void insert(string w)
{
TRIENode *ptr = headNode;
ptr->prefixCount++;
for(int i=0; i<w.length(); i++)
{
int index = w[i] - int('a');
if(ptr->child[index] ==NULL)
{
ptr->child[index] = new TRIENode();
}
ptr->child[index]->prefixCount++;
ptr = ptr->child[index];
}
ptr->word = true;
}
bool search(string str)
{
TRIENode *ptr = headNode;
for(int i=0; i<str.length(); i++)
{
int index = str[i] - 'a';
if(ptr->child[index] == NULL)
return false;
ptr = ptr->child[index];
}
if(ptr->isWord())
return true;
return false;
}
}dictionary;
Sunday, 14 July 2013
Print all the words in a 3x3 matrix 'c','b','k' ..... 'd','a','l' ...... 'g','t','i' . words can be found horizontally, vertically and diagonally (reverse/straight order).
Subscribe to:
Post Comments (Atom)
Correction in line 12:
ReplyDeleteint displacement[8][2] = {{-1,-1},{0,-1},{1,-1},{1,0},{-1,1},{0,1},{1,1},{-1,0}};
row 7 should be {1,1} instead of {-1,1}