从矩阵打印列表

时间:2019-06-10 12:24:01

标签: prolog

我需要一个给出这种样式的输入的函数:

printMatrix(N, M)

其中N是一个整数,M是一个整数列表:

printMatrix(3, [1,5,8,9 ...]).

其中3是单板的行数和列数。

连续的整数标记框号(1相当于矩阵的位置1(行),1(列),2等于1,2、3等于1,3、4等于2,1,5) 2、2、6、2.3、7、3.1、8、3.2和9、3.3)。您必须为列表中出现的每个数字画一个'X'。

在此示例中寻求的输出如下:

-------
| X | | |
-------
| | X | |
-------
| | X | X |

我什至不知道如何开始,欢迎任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以轻松计算每个框的索引。然后遍历每一行和每一列,并检查其对应的索引是否在输入列表中,并一路打印所需的值(“ X”或“'”,也将框的内壁交错):

printMatrix(N, M):-
  Width is 2*N+1,
  format('~`-t~*|', [Width]),
  forall(between(1,N,Row),
   (
    SBase is N*(Row-1)+1,
    EBase is N*Row,
    nl,
    write('|'),
    forall(between(SBase,EBase,Item),
      (
       (memberchk(Item, M)->write('X');write(' ')),
       write('|')
    ))
  )),
  nl,
  format('~`-t~*|', [Width]).

在这里,我使用forall/2between/3谓词遍历行和列,并使用memberchk/2来查看该项是否在列表中。

示例输出:

?- printMatrix(3,[1,4,5,9]).
-------
|X| | |
|X|X| |
| | |X|
-------

答案 1 :(得分:0)

您可以从以下基本解决方案开始,在3x3的情况下,矩阵具有从0到8的元素:

test:-
    % -------
    % | 0 | 1 | 2 |
    % | 3 | 4 | 5 |
    % | 6 | 7 | 8 |
    N = 3,
    L = [1,5,7],
    NN is N*N,
    write('|'),
    loop(0,NN,N,L).

check_newline(I,_,I):- !.
check_newline(V,Mod,Max):-
    V < Max, !,
    (   0 =:= mod(V,Mod) ->  nl,write('|'); true).

loop(H,H,_,_):- !.
loop(I,Max,N,[]):-
    I < Max, !,
    write('_|'),
    I1 is I+1,
    check_newline(I1,N,Max),
    loop(I1,Max,N,[]).
loop(H,Max,N,[H|T]):-
    H < Max, !,
    write('X|'),
    H1 is H+1,
    check_newline(H1,N,Max),
    loop(H1,Max,N,T).
loop(H,Max,N,[E|T]):-
    H < Max, !,
    H \= E,
    write('_|'),
    H1 is H+1,
    check_newline(H1,N,Max),
    loop(H1,Max,N,[E|T]).

?- test.
|_|X|_|
|_|_|X|
|_|X|_|
true

然后,您可以使代码复杂化,并做各种花哨的事情,甚至可以编写较短的代码。