//Each node, with 0, 1, 2, 3 along the middle, 4 and 5 at the top, and 6, 7 at the bottom
IntVar[] nodes = new IntVar[8];
int[,] neighbors = new int[,] {
{4, 1, 6, -1, -1, -1 },{0, 2, 4, 5, 6, 7 },{1, 3, 4, 5, 6, 7 },{2, 5, 7, -1, -1, -1 }, //middle
{0, 1, 2, 5, -1, -1 },{1, 2, 3, 4, -1, -1 }, //top
{0, 1, 2, 7, -1, -1 },{1, 2, 3, 6, -1, -1 } //bottom
};
//make each node
for (int i = 0; i < 8; i++) {
IntVar node = model.NewIntVar(0, 7, "NODE_" + i);
nodes[i] = node;
}
//add neighbor constraints
for (int i = 0; i < 8; i++) {
for (var j = 0; j < 6; j++) {
if (neighbors[i, j] >= 0) {
IntVar y = model.NewBoolVar("NEIGHBOR_CONSECUTIVE_" + i + "_" + j);
model.Add(nodes[i] > nodes[neighbors[i, j]]).OnlyEnforceIf(y);
model.Add(nodes[i] - nodes[neighbors[i, j]] > 1).OnlyEnforceIf(y);
model.Add(nodes[neighbors[i, j]] - nodes[i] > 1).OnlyEnforceIf(y.Not());
}
}
}
model.AddAllDifferent(nodes);