Download
/**
* Date: 2024
* Compilation: g++ nqueens_z3.cpp -lz3
*/
#include "z3++.h"
using namespace z3;
int main() {
std::cout<<"N-Queens"<<std::endl;
// Context
unsigned int n = 8;
context c;
// Variables declaration
expr_vector x(c);
for (unsigned i = 0; i < n; i++) {
std::stringstream x_name;
x_name << "x_" << i;
x.push_back(c.int_const(x_name.str().c_str()));
}
solver s(c);
// Domain definition
for (unsigned i = 0; i < n; i++) {
s.add(x[i] >= 0);
s.add(x[i] < static_cast<int>(n));
}
// Constraints
// Lines constraint
s.add(distinct(x));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j) {
// Diago constraint
s.add(x[i] != x[j] - abs(j - i));
s.add(x[i] != x[j] + abs(j - i));
}
}
}
std::cout << s.check() << std::endl;
// Search
model m = s.get_model();
for (unsigned i = 0; i < n; i++) {
std::cout << m.eval(x[i]) << " ";
}
return 0;
}