Sudoku中的字母数字解算器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sudoku中的字母数字解算器相关的知识,希望对你有一定的参考价值。
:- 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
答案
要将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
谓词可以简化转换代码。我把它作为练习留给你。提示:定义一个辅助谓词,它接受一个数字并返回相应的字母。
以上是关于Sudoku中的字母数字解算器的主要内容,如果未能解决你的问题,请参考以下文章