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 "examples/support.hh"
00039 #include "gecode/minimodel.hh"
00040
00051 class MagicSquare : public Example {
00052 private:
00054 const int n;
00056 IntVarArray x;
00057
00058 public:
00060 MagicSquare(const SizeOptions& opt)
00061 : n(opt.size()), x(this,n*n,1,n*n) {
00062
00063 const int nn = n*n;
00064
00065
00066 const int s = nn*(nn+1) / (2*n);
00067
00068
00069 MiniModel::Matrix<IntVarArray> m(x, n, n);
00070
00071 for (int i = n; i--; ) {
00072 linear(this, m.row(i), IRT_EQ, s, opt.icl());
00073 linear(this, m.col(i), IRT_EQ, s, opt.icl());
00074 }
00075
00076 {
00077 IntVarArgs d1y(n);
00078 IntVarArgs d2y(n);
00079 for (int i = n; i--; ) {
00080 d1y[i] = m(i,i);
00081 d2y[i] = m(n-i-1,i);
00082 }
00083 linear(this, d1y, IRT_EQ, s, opt.icl());
00084 linear(this, d2y, IRT_EQ, s, opt.icl());
00085 }
00086
00087
00088 distinct(this, x, opt.icl());
00089
00090
00091 rel(this, m(0,0), IRT_GR, m(0,n-1));
00092 rel(this, m(0,0), IRT_GR, m(n-1,0));
00093
00094 branch(this, x, INT_VAR_SIZE_MIN, INT_VAL_SPLIT_MIN);
00095 }
00096
00098 MagicSquare(bool share, MagicSquare& s) : Example(share,s), n(s.n) {
00099 x.update(this, share, s.x);
00100 }
00101
00103 virtual Space*
00104 copy(bool share) {
00105 return new MagicSquare(share,*this);
00106 }
00108 virtual void
00109 print(std::ostream& os) {
00110
00111 MiniModel::Matrix<IntVarArray> m(x, n, n);
00112 for (int i = 0; i<n; i++) {
00113 os << "\t";
00114 for (int j = 0; j<n; j++) {
00115 os.width(2);
00116 os << m(i,j) << " ";
00117 }
00118 os << std::endl;
00119 }
00120 }
00121
00122 };
00123
00127 int
00128 main(int argc, char* argv[]) {
00129 SizeOptions opt("MagicSquare");
00130 opt.iterations(1);
00131 opt.size(7);
00132 opt.parse(argc,argv);
00133 Example::run<MagicSquare,DFS,SizeOptions>(opt);
00134 return 0;
00135 }
00136
00137
00138