一般问题:我们有 8*8 的地图,我们必须用 1 到 6 的数字填充空方格。但是在每一列中,原始数字只能满足 1 次。每行和每列中的两个方格都留空。两边的数字,上下显示我们应该出现的第一个数字(但它可以出现在两个空方块之后)。
所以,现在我有了这个代码,它最终适用于 4*4 地图的 swi-prolog。
:- module(ab, [ab/0]).
:- [library(clpfd)].
gen_row(Ls):-length(Ls, 4), Ls ins 0..3.
transpose(Ms, Ts) :-
%must_be(list(list), Ms),
( Ms = [] -> Ts = []
; Ms = [F|_],
transpose(F, Ms, Ts)
).
transpose([], _, []).
transpose([_|Rs], Ms, [Ts|Tss]) :-
lists_firsts_rests(Ms, Ts, Ms1),
transpose(Rs, Ms1, Tss).
lists_firsts_rests([], [], []).
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :-
lists_firsts_rests(Rest, Fs, Oss).
ab :-
Rows = [R1,R2,R3,R4],
maplist(gen_row, Rows),
transpose(Rows, [C1,C2,C3,C4]),
maplist(all_distinct, [R1,R2,R3,R4]),
maplist(all_distinct, [C1,C2,C3,C4]),
start(R2, 3),
start(R3, 3),
finish(R3, 2),
start(C3, 1),
finish(C2, 2),
maplist(writeln, [R1,R2,R3,R4]).
finish(X, V) :-
reverse(X, Y),
start(Y, V).
start([0,Y|_], Y).
start([Y|_], Y).
但是,它不支持更大面积的 2 个空白位置的问题,例如 8*8 拼图。有什么提示吗?