:- lib(fd).

solve(Size) :-
	dim(Board, [Size, Size]),
	Board[1..Size, 1..Size] :: 0..1,
	
	(
            for(I, 1, Size),
            param(Board, Size)
        do
            (
                for(J, 1, Size),
                param(Board, I, Size)
            do
                (
		    attacked(Board, I, J, Size)
                )
            )
        ),
	
        term_variables(Board, Vars),
        min_max((labeling(Vars), print_res(Board, Size)), sum(Vars)),
	
%print_res(Board, Size).
	print(Board).

attacked(Board, I, J, Size) :-
        (
	    I >= J ->
		(
		    K is 1,
		    Diag is 0,
		    (
			for(L, 1, Size-I+J),
			param(Board, I, J, K)
		    do
			Diag #/\ Board[K, L],
			K is K+1
		    )
		),
		Diag #> 0
	;
		true
	).


/*
print_res(B, S) :-
        (
            for(I, 3, S+2),
            param(S, B) 
        do
            (
                for(J, 3, S+2),
                param(B, I)
            do
                N is B[I, J],
                printf("%d ", N)
            ),
            writeln("")
        ).
*/

