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

我想的是遍历网格中的每个元素并相应地检查值,用相应的字母替换它。

我如何遍历和替换数字,还是有更好的方法来解决这个问题?

错误:

enter image description here

谢谢! :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中的字母数字解算器的主要内容,如果未能解决你的问题,请参考以下文章

字谜解算器 C

PROLOG中的填字游戏解算器

适用于MNIST的逻辑回归的最优解算器的选择

python 制作LP解算器

ACM Sudoku

使用java程序实现:随机输入一串数字与字母,对这串字符进行分组排序