static void fillDefiniteValues (Cell[][] board, Cell[][] blocks, int p) {
		int x = 0;
		int y = 0;
		int emptyCellCount = -1;
		boolean flag = false;
		
		do {
			emptyCellCount = -1;
			//loop through each cell on the board checking if the cell is empty (has a cell value: 0)
			for (x = 0; x < 9; x++) {
				for (y = 0; y < 9; y++) {
					//if the current cell is empty, increment emptyCellCount
					if (board[x][y].getCellValue() == 0)
						emptyCellCount++;
				}
			}
		
			
			//if there remains at least one empty cell
			if (emptyCellCount+1 > 0) {
				//fill in the empty blocks who have only one possibleValue that makes a
				//correct cellValue.
				flag = fillEmptyCell (board);
				//run narrowTheSearch to update all cell's possibleValues arrayLists.
				narrowTheSearch (board, blocks);
				//recursively run solvePuzzle until the puzzle is solved.
				//solvePuzzleRec (board, blocks, x, y, emptyCellCount);
			}
			
			//if there are no empty cells left on the board then the board must be solved, therefore
			//the correct puzzle should be printed.
			if (emptyCellCount+1 == 0)
				displayBoard (board, p);
		
		} while (emptyCellCount+1 != 0 && flag == true);
	}