:- use_module(library(clpfd)).
go(Rows):-
foreach(J in 1..9, K in 1..9, Number = Rows[J,K],
Code is 0'A + Number - 1, char_code(Letter, Code), Rows[J,K] is Letter,nl)
sudoku(Rows) :-
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [A,B,C,D,E,F,G,H,I],
blocks(A, B, C),
blocks(D, E, F),
blocks(G, H, I),
maplist(label, Rows),
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).但这解决了一个包含从1到9的数字的数独,我需要做一些事情来将1到9转换为A到I
我的想法是遍历网格中的每个元素,并相应地检查值,将其替换为相应的字母表。
我如何遍历和替换这些数字,或者有更好的方法来解决这个问题?
错误:

谢谢!:D
发布于 2018-09-02 01:24:19
要将1..9间隔中的数字转换为A..I间隔中的字母,可以使用以下目标:
Code is 0'A + Number - 1, char_code(Letter, Code)例如:
?- Number = 4, Code is 0'A + Number - 1, char_code(Letter, Code).
Number = 4,
Code = 68,
Letter = 'D'.假设解决方案矩阵由列表列表表示,可以使用以下内容完成转换:
convert_matrix([], []).
convert_matrix([Row| Rows], [ConvertedRow| ConvertedRows]) :-
convert_row(Row, ConvertedRow),
convert_matrix(Rows, ConvertedRows).
convert_row([], []).
convert_row([Number| Numbers], [Letter| Letters]) :-
Code is 0'A + Number - 1,
char_code(Letter, Code),
convert_row(Numbers, Letters).但是可以使用maplist谓词简化转换代码。我把它留给您作为练习。提示:定义一个接受数字并返回相应字母的辅助谓词。
https://stackoverflow.com/questions/52129990
复制相似问题