Well, I think you should have seven functions. Please use scroll bar to see entire code since it doesn't all fit on the screen:
CODE
// returns row number with exactly one missing cell in the row. Returns -1 if none exist yet.
int FindRowReadyToSolve ();
// returns column number with exactly one missing cell in column. Returns -1 if none exist yet
int FindColumnReadyToSolve ();
// returns true if there is a box ready to be solved. row and column are set to upper left corner of box.
// returns false otherwise
bool FindBoxReadyToSolve (int& row, int& column);
// given a row with eight entries, fills in missing entry
void Solve Row (int row);
// given a column with eight entries, fills in missing entry
void SolveColumn (int column);
// given a box with eight entries, fills in missing entry
// row and column are upper left coordinates of box
void SolveBox (int row, int column);
// Traverses columns, rows, and boxes for duplicates. Returns false if
// illegal entry exists, true otherwise
bool CheckIf Legal ();
For a brute force solution, continually call FindRowReadyToSolve, FindColumnReadyToSolve, and FindBoxReadyToSolve. If none of them give you anything ready to solve, by your algorithm, it is unsolvable. If you find one ready to solve, call the appropriate function to fill in the missing cell. After each time when you fill a new cell and solve it, call CheckIfLegal. If you have an illegal entry, by your algorithm, it's unsolvable.
Anyway, I think that's a decent way of approaching it using your algorithm. You might want to consider changing algorithms as I believe yours will miss some solutions and there are more efficient ones (albeit probably more complex), but if you want to stick with that one, this may work. There are also a lot of earlier posts on similar problems on this site, so they may give you some other ideas as well. Good luck. Am I understanding your algorithm correctly? Also, this is one way, but not the only way to do it.