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;