/
binary_queens.cpp
82 lines (70 loc) · 2.51 KB
/
binary_queens.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <gecode/driver.hh>
#include <gecode/int.hh>
#include <gecode/minimodel.hh>
using namespace Gecode;
class Queens : public Script {
protected:
IntVarArray q;
public:
Queens(const SizeOptions& opt) : q(*this, opt.size() * opt.size(), 0, 1) {
Matrix<IntVarArray> matrix(q, opt.size(), opt.size());
// Distinct col
for (int i = 0; i < opt.size(); ++i) {
count(*this, matrix.col(i), 1, IRT_EQ, 1);
count(*this, matrix.row(i), 1, IRT_EQ, 1);
}
// Diagonal
for (int j = 0; j < opt.size(); ++j) {
IntVarArray dia(*this, opt.size()-j);
for (int i = 0; i+j < opt.size(); ++i) {
dia[i] = matrix(i+j, i);
}
count(*this, dia, 1, IRT_LQ, 1);
}
for (int j = 0; j < opt.size(); ++j) {
IntVarArray dia(*this, opt.size()-j);
for (int i = 0; i+j < opt.size(); ++i) {
dia[i] = matrix(i, i+j);
}
count(*this, dia, 1, IRT_LQ, 1);
}
for (int j = 0; j < opt.size(); ++j) {
IntVarArray dia(*this, opt.size()-j);
for (int i = 0; i+j < opt.size(); ++i) {
dia[i] = matrix((opt.size() - 1) - (i + j), i);
}
count(*this, dia, 1, IRT_LQ, 1);
}
for (int j = 0; j < opt.size(); ++j) {
IntVarArray dia(*this, opt.size()-j);
for (int i = 0; i+j < opt.size(); ++i) {
dia[i] = matrix((opt.size() - 1) - (i + 0), i + j);
}
count(*this, dia, 1, IRT_LQ, 1);
}
branch(*this, q, INT_VAR_RND, INT_VAL_MAX);
}
Queens(bool share, Queens& s) : Script(share, s) {
q.update(*this, share, s.q);
}
virtual Space* copy(bool share) {
return new Queens(share, *this);
}
virtual void print(std::ostream& os) const {
os << "queens\t";
for (int i = 0; i < q.size(); i++) {
os << q[i];
if ((i+1) % (int)sqrt(q.size()) == 0) {
os << std::endl << "\t";
}
}
os << std::endl;
}
};
int main(int argc, char* argv[]) {
SizeOptions opt("Queens");
opt.size(10);
opt.parse(argc,argv);
Script::run<Queens, DFS, SizeOptions>(opt);
return 0;
}