Una solución para $n = 5$:
n = 5
(1;3), (1;5), (2;2), (2;3), (3;4), (3;5), (4;1), (4;4), (5;1), (5;2)
5: xx
4: x x
3: xx
2: xx
1: x x
-----
12345
Y otra solución para $n=11$:
n = 11
(1;1), (1;2), (2;5), (2;7), (3;4), (3;6), (4;9), (4;10),
(5;1), (5;3), (6;4), (6;8), (7;9), (7;11), (8;2), (8;3),
(9;6), (9;8), (10;5), (10;7), (11;10), (11;11)
11: xx
10: x x
9: x x
8: xx
7: x x
6: x x
5: x x
4: xx
3: x x
2: x x
1: xx
-----------
12345678901
Las soluciones que se encontraron con la siguiente MiniZinc solver de restricciones del modelo:
int: n = 11;
set of int: Range = 1..n;
set of int: N2 = 1..2*n;
% We assume/enforce 2 points per row
array[N2] of Range: x = [(i +1 ) div 2 | i in N2];
array[N2] of var Range: y;
% For every integer i (1≤i≤2n), xi and yi are integers between 1 and n
% ==> implicit constraint expressed by domain of decision variables
% All points are different, i.e. for every integer 1≤i<j≤2n, it satisfies xi≠xj or yi≠yj
constraint forall(i, j in N2 where j > i)(
(x[i] != x[j]) \/ (y[i] != y[j])
);
% For all integers i,j,k (1≤i<j<k≤2n), (xi,yi),(xj,yj),(xk,yk) are not collinear
constraint forall(i, j, k in N2 where (i < j) /\ (j < k)) (
% https://www.urbanpro.com/gre-coaching/how-to-determine-if-points-are-collinear
% area of the triangle != 0 <==> non collinear
0 != (x[i]*y[j] - x[i]*y[k] - x[j]*y[i] + x[j]*y[k] + x[k]*y[i] - x[k]*y[j])
);
% Extra constraint to keep points sorted and speed-up search
constraint forall(i in 1..2*n-1) (
(x[i+1] > x[i]) \/
((x[i+1] == x[i]) /\ (y[i+1] > y[i]))
);
solve satisfy;
function string: point(Range: i, Range: j) =
if 0 == sum(k in N2)((fix(x[k]) == i) /\ (fix(y[k]) == j)) then " " else "x" endif;
output [ "n = " ++ show(n) ++ " "] ++
[ (if i == 1 then "" else ", " endif) ++ "(" ++ show(x[i]) ++ ";" ++ show(y[i]) ++ ")"
| i in N2] ++
[ if j == 1 then "\n" ++ show_int(2, n - i + 1) ++ ": " else "" endif ++
point(n - i + 1, j) | i, j in Range] ++
[ if i == 1 then "\n -" else "-" endif | i in Range ] ++
[ if i == 1 then "\n 1" else show(i mod 10) endif | i in Range ]
;