[ Back to the overview Matrix ]

Test case : 8 Queens Problem using C++

Lines used: 52
// n-queens solution, implemented in C++ // Time for 22 queens = 2.46s on Athlon 2400 // Lines used: 51
 
#include <vector>
#include <iostream>

class Queens
{
    int size;
    std::vector<int> queens;

    bool attacks(int x0, int y0, int x1, int y1)
    {
        return x0==x1 || y0==y1 || abs(x0-x1)==abs(y0-y1);
    }

    bool solve(int x=0)
    {
        if(x==size)
        {
            printSolution();
            return true;
        }

        for(int y=0; y<size; ++y)
        {
            bool attacked=false;

            // Test that the queen does not attack position (x,y) with any previous queens
            for(int x0=0; x0<x; ++x0)
                if(attacks(x0,queens[x0],x,y)) { attacked=true; break; }

            if(!attacked)
            {
                queens[x]=y;
                if(solve(x+1)) return true;
            }
        }
        return false;
    }

    void printSolution()
    {
        for(int y=0; y<size; ++y)
        {
            for(int x=0; x<size; ++x)
                std::cout << (queens[y]==x ? 'Q' : '_');
            std::cout << std::endl;
        }
    }

public:
    Queens(int s) : size(s), queens(size)
    {
        solve();
    }
};


int main(int argc, char **argv)
{
    int size = argc==2 ? atoi(argv[1]) : 8;

    Queens q(size);

    return 0;
}



Contributed by Calum Grant, calum at visula.org