Download
#include<ilsolver/ilcint.h>

ILOSTLBEGIN

class IlcIntSelectMaxI : public IlcIntSelectI {
public:
    IlcIntSelectMaxI(){};
    virtual IlcInt select(IlcIntVar var);
};

IlcInt IlcIntSelectMaxI::select(IlcIntVar var){
    return var.getMax();
}

IlcIntSelect IlcIntSelectMax(IlcManager m){
    return IlcIntSelect(new (m.getHeap()) IlcIntSelectMaxI());
}

void prob007large(IlcManager m, int n){
  IlcIntVarArray x(m, n, 0, n-1);
  IlcIntVarArray y(m, n-1, 1, n-1);
  int i;
  for (i=0; i<n-1; i++){
    m.add(y[i]==IlcAbs(x[i+1] - x[i]));
  }
  m.add(x[0] < x[1]);
  m.add(IlcAllDiff(x, IlcWhenRange));
  m.add(IlcAllDiff(y, IlcWhenRange));
  m.add(IlcGenerate(y, IlcChooseMaxMaxInt, IlcIntSelectMax(m)));
  m.add(IlcGenerate(x));
}

void prob007AC(IlcManager m, int n){
  IlcIntVarArray x(m, n, 0, n-1);
  IlcIntVarArray y(m, n-1, 1, n-1);
  IlcIntTupleSet set(m,3);
  int i,j;
  for(i=0;i<n-1;i++){
    for(j=i+1;j<n;j++){
      set.add(IlcIntArray(m,3, i, j, IlcAbs(j-i)));
      set.add(IlcIntArray(m,3, j, i, IlcAbs(j-i)));
    }
  }
  set.close();
  for (i=0; i<n-1; i++){
    IlcIntVarArray vars(m, 3, x[i], x[i+1], y[i]);
    m.add(IlcTableConstraint(vars, set, IlcTrue));
  }
  m.add(IlcAllDiff(x, IlcWhenDomain));
  m.add(IlcAllDiff(y, IlcWhenDomain));
  m.add(IlcGenerate(x, IlcChooseMinSizeInt));
}

void prob007(IlcManager m, int n) {
  IlcIntVarArray x(m, n, 0, n-1);
  IlcIntVarArray y(m, n-1, 1, n-1);
  for (int i=0; i<n-1; i++)
    m.add(y[i]==IlcAbs(x[i+1] - x[i]));
  m.add(IlcAllDiff(x, IlcWhenRange));
  m.add(IlcAllDiff(y, IlcWhenRange));
  m.add(IlcGenerate(x, IlcChooseMinSizeInt));
}

int main(int argc, char** argv) {
  IlcManager m(IlcNoEdit);
  int n = (argc>1)? atoi(argv[1]): 10;
  prob007(m, n);
  //prob007AC(m, n);
  int sol=0;
  //m.nextSolution();
  // m.nextSolution();

  //m.out() << x << endl;
   while(m.nextSolution()){
      sol++;
    }
    m.out() << sol << endl;
  m.printInformation();
  m.end();
  return 0;
}