I set myself the following additional goal (devised by me):

Before the freedom gets taken away in the choice of code I get to write, I did something fun today -- a Sudoku Solver. It prints the solution to the hardest problem in the world (according to the telegraph) in a few milliseconds. I chose to do this project for several reasons. First, this is something larger in scale than my previous projects; hence I had to spend more time to debug and had to summon up greater perseverance to finish the code. Now that I have a sense of achievement, I will be excited for more code to come. Next, it allowed me to get organised and start planning how the different methods interact with each other. This was crucial here. Lastly, it is a lot more fun that doing something on the lines of a bisection method. I took computer science last year and I wrote that in Java. Writing it again in C++ will give me almost no value. On the contrary, I learnt more about arrays and exceptions in C++ while coding this! Hope you find this fun. Enjoy!

#include 
#include 
using namespace std;

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex;

int mRows,mCols;
bool toGoBack;
int grid[9][9] = {{8,0,0,0,0,0,0,0,0},
                  {0,0,3,6,0,0,0,0,0},
                  {0,7,0,0,9,0,2,0,0},
                  {0,5,0,0,0,7,0,0,0},
                  {0,0,0,0,4,5,7,0,0},
                  {0,0,0,1,0,0,0,3,0},
                  {0,0,1,0,0,0,0,6,8},
                  {0,0,8,5,0,0,0,1,0},
                  {0,9,0,0,0,0,4,0,0}};
bool fixedGrid[9][9];

void createGrid()
{
    for (int i=0;i<9;i++){
        for (int j=0;j<9;j++){
            if (grid[i][j] != 0){fixedGrid[i][j] = true;}
        }
    }
}

void moveForwards()
{
    if (mCols == 8){
        mRows++;
        mCols = 0;
    } else {
        mCols++;
    }
}

void moveBackwards()
{
    if (mCols == 0 && mRows == 0){throw myex;}
    if (mCols == 0){
        mRows--;
        mCols = 8;
    } else {
        mCols--;
    }
}

bool notSafe(int value)
{
    for (int i=0;i<9;i++){
        if (i == mRows){continue;}
        if (grid[i][mCols] == value){
            return true;
        }
    }
    for (int i=0;i<9;i++){
        if (i == mCols){continue;}
        if (grid[mRows][i] == value){
            return true;
        }
    }
    int boxRow = ((mRows/3)*3);
    int boxCol = ((mCols/3)*3);
    for (int i=boxRow;i 8){
                grid[mRows][mCols] = 0;
                moveBackwards();
                toGoBack = true;
                break;
            }
            presentValue++;
        }
        if (toGoBack){continue;} //so that we do not update the current cell when we are backtracking
        grid[mRows][mCols] = presentValue;
        moveForwards();
                }
}

int main()
{
    try
    {
        createGrid();
        solve();
        cout << " -------------------------------------" << endl;
        for (int i=0; i<9; i++){
            cout << " | ";
            for (int j=0; j<9; j++){
                cout << grid[i][j] << " | ";
            }
            cout << endl;
            cout << " -------------------------------------" << endl;
        }
    }
    catch (const std::exception&)
    {
        cout << "Sudoku cannot be solved";
        return 0;
    }
}