dominating-queens.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <gecode/driver.hh>
00039 #include <gecode/int.hh>
00040 #include <gecode/minimodel.hh>
00041
00042 using namespace Gecode;
00043
00057 class DominatingQueens : public MinimizeScript {
00058 protected:
00060 const int n;
00062 IntVarArray b;
00064 IntVar q;
00066 int xy(int x, int y) const {
00067 return y*n + x;
00068 }
00070 int x(int xy) const {
00071 return xy % n;
00072 }
00074 int y(int xy) const {
00075 return xy / n;
00076 }
00078 IntSet attacked(int xy) {
00079 IntArgs a;
00080 for (int i=0; i<n; i++)
00081 for (int j=0; j<n; j++)
00082 if ((i == x(xy)) ||
00083 (j == y(xy)) ||
00084 (abs(i-x(xy)) == abs(j-y(xy))))
00085 a << DominatingQueens::xy(i,j);
00086 return IntSet(a);
00087 }
00088 public:
00090 DominatingQueens(const SizeOptions& opt)
00091 : n(opt.size()), b(*this,n*n,0,n*n-1), q(*this,1,n) {
00092
00093
00094 for (int i=0; i<n*n; i++)
00095 dom(*this, b[i], attacked(i));
00096
00097
00098 nvalues(*this, b, IRT_LQ, q);
00099
00100
00101
00102
00103
00104
00105
00106 if (n <= 120)
00107 dom(*this, q, (n+1)/2, (n+1)/2 + 1);
00108
00109 branch(*this, b, INT_VAR_SIZE_MIN, INT_VAL_MIN);
00110
00111 branch(*this, q, INT_VAL_MAX);
00112 }
00113
00115 virtual IntVar cost(void) const {
00116 return q;
00117 }
00118
00120 DominatingQueens(bool share, DominatingQueens& s)
00121 : MinimizeScript(share,s), n(s.n) {
00122 b.update(*this, share, s.b);
00123 q.update(*this, share, s.q);
00124 }
00125
00127 virtual Space*
00128 copy(bool share) {
00129 return new DominatingQueens(share,*this);
00130 }
00131
00133 virtual void
00134 print(std::ostream& os) const {
00135 os << "\tNumber of Queens: " << q << std::endl;
00136 os << "\tBoard: " << b << std::endl;
00137 if (b.assigned()) {
00138
00139 bool* placed = new bool[n*n];
00140 for (int i=0; i<n*n; i++)
00141 placed[i] = false;
00142 for (int i=0; i<n*n; i++)
00143 placed[b[i].val()] = true;
00144 for (int j=0; j<n; j++) {
00145 std::cout << "\t\t";
00146 for (int i=0; i<n; i++)
00147 std::cout << (placed[xy(i,j)] ? 'Q' : '.') << ' ';
00148 std::cout << std::endl;
00149 }
00150 delete [] placed;
00151 }
00152 os << std::endl;
00153 }
00154 };
00155
00159 int
00160 main(int argc, char* argv[]) {
00161 SizeOptions opt("DominatingQueens");
00162 opt.size(7);
00163 opt.solutions(0);
00164 opt.parse(argc,argv);
00165 MinimizeScript::run<DominatingQueens,BAB,SizeOptions>(opt);
00166 return 0;
00167 }
00168
00169
00170