Sudoku中的字母数字解算器

问题描述 投票:0回答:1
:- 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

prolog backtracking sudoku
1个回答
1
投票

要将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谓词可以简化转换代码。我把它作为练习留给你。提示:定义一个辅助谓词,它接受一个数字并返回相应的字母。

© www.soinside.com 2019 - 2024. All rights reserved.