nQueens0.mod#

nQueens0.mod

param n;

set ROWS := {1..n};
set COLUMNS := {1..n};

var X{ROWS, COLUMNS} binary;
   # X[i,j] is one if there is a queen at (i,j); else zero

#maximize max_queens: sum {i in ROWS, j in COLUMNS} X[i,j];

subject to column_attacks {j in COLUMNS}:
    sum {i in ROWS} X[i,j] = 1;

subject to row_attacks {i in ROWS}:
    sum {j in COLUMNS} X[i,j] = 1;

subject to diagonal1_attacks {k in 2..2*n}:
    sum {i in ROWS, j in COLUMNS: i+j=k} X[i,j] <= 1;

subject to diagonal2_attacks {k in -(n-1)..(n-1)}:
    sum {i in ROWS, j in COLUMNS: i-j=k} X[i,j] <= 1;