crossword puzzle Algorithm

The game's goal is to fill the white squares with letters, forming words or phrases, by solve hints, which lead to the answers. In languages that are write leave-to-right, the answer words and phrases are put in the grid from leave to right and from top to bottom. Crossword-like puzzles, for example double Diamond Puzzles, looked in the magazine St. Nicholas, published since 1873.An illustrator later reversed the" word-cross" name to" cross-word.1933.The New York times begin to publish a crossword puzzle on 15 February 1942, spurred on by the idea that the puzzle could be a welcome distraction from the harsh news of universe War II.
#include <bits/stdc++.h> 
using namespace std; 

// ways are to calculate the number of 
// possible ways to fill the grid 
int ways = 0; 

// this function is used to print 
// the resultant matrix 
void printMatrix(vector<string>& matrix, int n) 
{ 
	for (int i = 0; i < n; i++) 
		cout << matrix[i] << endl; 
} 

// this function checks for the current word 
// if it can be placed horizontally or not 
// x -> it represent index of row 
// y -> it represent index of column 
// currentWord -> it represent the 
// current word in word array 
vector<string> checkHorizontal(int x, int y, 
							vector<string> matrix, 
							string currentWord) 
{ 
	int n = currentWord.length(); 

	for (int i = 0; i < n; i++) { 
		if (matrix[x][y + i] == '#' || 
			matrix[x][y + i] == currentWord[i]) { 
			matrix[x][y + i] = currentWord[i]; 
		} 
		else { 

			// this shows that word cannot 
			// be placed horizontally 
			matrix[0][0] = '@'; 
			return matrix; 
		} 
	} 

	return matrix; 
} 

// this function checks for the current word 
// if it can be placed vertically or not 
// x -> it represent index of row 
// y -> it represent index of column 
// currentWord -> it represent the 
// current word in word array 
vector<string> checkVertical(int x, int y, 
							vector<string> matrix, 
							string currentWord) 
{ 
	int n = currentWord.length(); 

	for (int i = 0; i < n; i++) { 
		if (matrix[x + i][y] == '#' || 
			matrix[x + i][y] == currentWord[i]) { 
			matrix[x + i][y] = currentWord[i]; 
		} 
		else { 

			// this shows that word 
			// cannot be placed vertically 
			matrix[0][0] = '@'; 
			return matrix; 
		} 
	} 
	return matrix; 
} 

// this function recursively checks for every 
// word that can align vertically in one loop 
// and in another loop it checks for those words 
// that can align horizontally words -> it 
// contains all the words to fill in a crossword 
// puzzle matrix -> it contain the current 
// state of crossword index -> it represent 
// the index of current word n -> it represent 
// the length of row or column of the square matrix 
void solvePuzzle(vector<string>& words, 
				vector<string> matrix, 
				int index, int n) 
{ 
	if (index < words.size()) { 
		string currentWord = words[index]; 
		int maxLen = n - currentWord.length(); 

		// loop to check the words that can align vertically. 
		for (int i = 0; i < n; i++) { 
			for (int j = 0; j <= maxLen; j++) { 
				vector<string> temp = checkVertical(j, i, 
										matrix, currentWord); 

				if (temp[0][0] != '@') { 
					solvePuzzle(words, temp, index + 1, n); 
				} 
			} 
		} 

		// loop to check the words that can align horizontally. 
		for (int i = 0; i < n; i++) { 
			for (int j = 0; j <= maxLen; j++) { 
				vector<string> temp = checkHorizontal(i, j, 
									matrix, currentWord); 

				if (temp[0][0] != '@') { 
					solvePuzzle(words, temp, index + 1, n); 
				} 
			} 
		} 
	} 
	else { 
		// calling of print function to 
		// print the crossword puzzle 
		cout << (ways + 1) << " way to solve the puzzle "
			<< endl; 
		printMatrix(matrix, n); 
		cout << endl; 

		// increase the ways 
		ways++; 
		return; 
	} 
} 

// Driver Code 
int main() 
{ 
	// length of grid 
	int n1 = 10; 

	// matrix to hold the grid of puzzle 
	vector<string> matrix; 

	// take input of puzzle in matrix 
	// input of grid of size n1 x n1 
	matrix.push_back("*#********"); 
	matrix.push_back("*#********"); 
	matrix.push_back("*#****#***"); 
	matrix.push_back("*##***##**"); 
	matrix.push_back("*#****#***"); 
	matrix.push_back("*#****#***"); 
	matrix.push_back("*#****#***"); 
	matrix.push_back("*#*######*"); 
	matrix.push_back("*#********"); 
	matrix.push_back("***#######"); 

	vector<string> words; 

	// the words matrix will hold all 
	// the words need to be filled in the grid 
	words.push_back("PUNJAB"); 
	words.push_back("JHARKHAND"); 
	words.push_back("MIZORAM"); 
	words.push_back("MUMBAI"); 

	// initialize the number of ways 
	// to solve the puzzle to zero 
	ways = 0; 

	// recursive function to solve the puzzle 
	// Here 0 is the initial index of words array 
	// n1 is length of grid 
	solvePuzzle(words, matrix, 0, n1); 
	cout << "Number of ways to fill the grid is "
		<< ways << endl; 

	return 0; 
} 

LANGUAGE:

DARK MODE: