/* Author: James Pate Williams, Jr. (c) 2000 Arc-consistency lookahead 1 algorithm applied to the N-Queens CSP. Algorithm from _Foundations of Constraint Satisfaction_ by E. P. K. Tsang Chapter 5 page 127. AC-4 from page 87. */ #include #include #include #include #include #include using namespace std; int constraintsViolated(vector &Q) { int a, b, c = 0, i, j, n; n = Q.size(); for (i = 0; i < n - 1; i++) { a = Q[i]; for (j = i + 1; j < n; j++) { b = Q[j]; if (a != - 1 && b != - 1) { if (a == b) c++; if (i - j == a - b || i - j == b - a) c++; } } } return c; } bool satisfies(int x, int v, int y, int w) { if (x == y) return false; if (v == w) return false; if (x - y == v - w || x - y == w - v) return false; return true; } bool ReviseDomain(int n, int x, int y, vector *D) { bool c, deleted = false; int a, b, i, j; vector label(n, - 1); for (i = 0; i < D[x].size(); i++) { a = D[x][i]; label[x] = a; for (c = false, j = 0; !c && j < D[y].size(); j++) { b = D[y][j]; label[y] = b; if (constraintsViolated(label) == 0) c = true; label[y] = - 1; } if (!c) { vector::iterator vIterator = find(D[x].begin(), D[x].end(), a); if (vIterator == D[x].end()) { cout << "error: can't find a = " << a << endl; cout << "D[" << x << "][" << i << "] = " << a << endl; cout << "D[" << x << "].size() = " << D[x].size() << endl; for (j = 0; j < D[x].size(); j++) cout << "D[" << x << "][" << j << "] = " << D[x][j] << endl; exit(1); } D[x].erase(vIterator); deleted = true; } label[x] = - 1; } return deleted; } class Label { private: int x, v; public: Label(int x, int v) {this->x = x; this->v = v;} int getX(void) {return x;} int getV(void) {return v;} void setX(int x) {this->x = x;} void setV(int v) {this->v = v;} bool operator == (const Label &label) { return x == label.x && v == label.v; } }; typedef vector