He, Peng

A Roboticist.

Be Focused & Cool.


Eight-Queens Puzzle

A C++ code sample from me that uses the back-tracking to solve the eight queens problem.

class Solution {
private:
    int col_pos_at_row[8]{};    // put a {} to init。
    int answer_count = 0;

public:
    void place_queen(int row) { // call entrance from place_queen(row=0)
        // when you reached
        if (row == 8) {
            // row 0~7 has done, which is 8 queens
            cout << "Solution " << ++answer_count << endl;
            print_queens();
            return;
        }
        for (int col = 0; col < 8; ++col) {
            if (is_valid(row, col)) {
                /*
                 * back tracking happens here. 
                 * test if at (row, col) is valid, if not, we don't set the value.
                 * basically means we put a value at (row, col) and if not valid, 
                 * take it back. Because of the 1D-col-array, 
                 * it is a little different from the 2D grid value. 
                 * The magic is because of col_pos_at_row[row] is a single value,
                 * so when you hit row == 8 and it goes back to the next try, 
                 * which is the next col value in the same row, you see it is not
                 * disturbed by our last col value. 
                 */
                col_pos_at_row[row] = col;
                place_queen(row + 1);
            }
        }
    }

    bool is_valid(int row, int col) {
        int left_diag_up = col -1, right_diag_up = col +1;
        // buttom up so the row is -1
        for (int r = row-1; r >= 0 ; --r) {
            if (col_pos_at_row[r] == col)
                return false;
            if (left_diag_up >=0 && col_pos_at_row[r] == left_diag_up)
                return false;
            if (right_diag_up < 8 && col_pos_at_row[r] == right_diag_up)
                return false;

            --left_diag_up, ++right_diag_up;
        }

        return true;
    }

    void print_queens() {
        for (int row = 0; row < 8; ++row) {
            cout << "R-" << row << ": ";
            for (int col = 0; col < 8; ++col) {
                if (col_pos_at_row[row] == col)
                    cout << "Q ";
                else
                    cout << "* ";
            }
            cout << endl;
        }
        cout << "--------------" << endl;
    }
};

int main() {
    auto sol = Solution();
    sol.place_queen(0);
}