Maybe it's time to look at prolog. :-)
P.s: Sorry for the broken new-lines.<p>:- use module(library(clpfd)).
sudoku(Rs) :-
flatten(Rs,Vs),
Vs ins 1 .. 9,
rows(Rs),
columns(Rs),
blocks(Rs),
label(Vs),
maplist(writeln,Rs).<p>rows(Rs) :- maplist(all distinct,Rs).<p>columns(Rs) :- columns(9,Rs).
columns(0,Rs).
columns(N,Rs) :-
N > 0,
N1 is N-1,
maplist(nth0(N1),Rs,X),
all distinct(X),
columns(N1,Rs).<p>blocks([A,B,C,D,E,F,G,H,I]) :-
blocks(A,B,C),
blocks(D,E,F),
blocks(G,H,I).
blocks([],[],[]).
blocks([A,B,C|Bs1],[D,E,F|Bs2],[G,H,I|Bs3]) :-
all distinct([A,B,C,D,E,F,G,H,I]),
blocks(Bs1,Bs2,Bs3).