private void guess() {
		Cell mpCell = getMinPossibleCell(cellList);
		mpStack = new Stack<Sudoku.Cell>();
		cellsStack = new Stack<List<Cell>>();
		mpCellSet.add(mpCell);
		// push the mpCell and cellList into stack
		mpStack.push(mpCell);
		cellsStack.push(cellList);
		while (count < 81) {
			// guess the possibles of the mpCell in order
			int possibles = mpCell.possibleList.size();
			System.out.println("Possibles:" + mpCell.possibleList + mpCell);
			if (possibles <= mpCell.imposibleList.size()) {
				System.out.println("NO POSSIBLES!!!");
				mpCell.imposibleList.clear();
				// pop out the previous one
				mpCell = mpStack.pop();
				cellList = cellsStack.pop();
				System.out.println("%%%%%% Stack Pop" + mpCell + " value = "
						+ mpCell.value + " size: " + mpStack.size());
				// add the wrong number to the
				// impossible list
				mpCell.imposibleList.add(mpCell.value);
//				mpCell.removePossible(mpCell.value);
				mpCell.value = '.';
				count--;
				continue;
			}
			
			for (int i = 0; i < possibles; i++) {
				char possibleValue = mpCell.possibleList.get(i);
				if (mpCell.imposibleList.contains(possibleValue)) {
					continue;
				}

				if (mpCell.isValid(possibleValue)) {
					System.out.println("^^^^^^VALID Possible Value:" + possibleValue + mpCell);
					mpCell.value = possibleValue;
					count++;
					mpStack.push(mpCell);
					cellsStack.push(cellList);
					System.out.println("Stack Push" + mpCell + " with value: " + possibleValue
							+ " size: " + mpStack.size());
					
					// get another mpCell and guess it
					mpCell = getAnotherMinPossibleCell(mpCell);
					break;
				} else {
					System.out.println("#######NOT VALID Possible Value:" + possibleValue + mpCell);
					mpCell.imposibleList.add(possibleValue);

					if (i == possibles - 1 || possibles == mpCell.imposibleList.size()) {
						// tried all possibles, so must
						// the previous one is filled
						// with wrong number, clear the
						// impossible list
						System.out.println("@@@@@@@Tried all possibles" + mpCell);
						mpCell.imposibleList.clear();
						// pop out the previous one
						mpCell = mpStack.pop();
						cellList = cellsStack.pop();
						System.out.println("%%%%%% Stack Pop" + mpCell + " value = "
								+ mpCell.value + " size: " + mpStack.size());
						// add the wrong number to the
						// impossible list
						mpCell.imposibleList.add(mpCell.value);
//						mpCell.removePossible(mpCell.value);
						mpCell.value = '.';
						count--;
						break;
					}
				}
			}
			// if the possible value is not valid, back to previous
			// state, guess the next possible
			// if the possible value is valid, set the value to the
			// cell, push the mpCell and cellList into stack,
			// get the next mpCell and guess it
			
			System.out.println("COUNT = " + count);
		}
		 
	}