首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >prolog中字母表求解器的数独

prolog中字母表求解器的数独
EN

Stack Overflow用户
提问于 2018-09-02 00:16:50
回答 1查看 225关注 0票数 0
代码语言:javascript
运行
复制
:- 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

EN

回答 1

Stack Overflow用户

发布于 2018-09-02 01:24:19

要将1..9间隔中的数字转换为A..I间隔中的字母,可以使用以下目标:

代码语言:javascript
运行
复制
Code is 0'A + Number - 1, char_code(Letter, Code)

例如:

代码语言:javascript
运行
复制
?- Number = 4, Code is 0'A + Number - 1, char_code(Letter, Code).
Number = 4,
Code = 68,
Letter = 'D'.

假设解决方案矩阵由列表列表表示,可以使用以下内容完成转换:

代码语言:javascript
运行
复制
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谓词简化转换代码。我把它留给您作为练习。提示:定义一个接受数字并返回相应字母的辅助谓词。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52129990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档