我需要一个给出这种样式的输入的函数:
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 |
我什至不知道如何开始,欢迎任何帮助。
答案 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/2和between/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
然后,您可以使代码复杂化,并做各种花哨的事情,甚至可以编写较短的代码。