Math 为什么我不能在程序中变异矩阵?
我的任务是用Maple解决一个4x4数独难题。我构造了一个4x4矩阵,其每个元素都是一个列表。每个列表包含数字1、2、3、4。 我的算法是找到一个只包含一个数字的网格,并使用它来消除水平和垂直网格中列表中的相同数字 这是我的密码: 我使用了一个名为removeElement的过程来从列表中删除一个数字,但删除之后似乎是一样的。矩阵是不可变的吗?如何修复它? 此外,我还使用了一个名为tester的计数器来检查程序,以查看矩阵是否可更改Math 为什么我不能在程序中变异矩阵?,math,logic,sudoku,discrete-mathematics,maple,Math,Logic,Sudoku,Discrete Mathematics,Maple,我的任务是用Maple解决一个4x4数独难题。我构造了一个4x4矩阵,其每个元素都是一个列表。每个列表包含数字1、2、3、4。 我的算法是找到一个只包含一个数字的网格,并使用它来消除水平和垂直网格中列表中的相同数字 这是我的密码: 我使用了一个名为removeElement的过程来从列表中删除一个数字,但删除之后似乎是一样的。矩阵是不可变的吗?如何修复它? 此外,我还使用了一个名为tester的计数器来检查程序,以查看矩阵是否可更改 solveSudoku := proc(M) local i;
solveSudoku := proc(M)
local i; local j; local goAhead; local k; local index;
local tester;
tester:=0;
while tester<10 do
i:=1; j:=1;
for i from 1 to 4 do
for j from 1 to 4 do
if(nops(M[i,j]) = 1) then
# The current matrix element has only one possibility
# cancel all possibilities in horizontal
for k from 1 to 4 do
#Every element of the matrix is a list
#I was trying to remove a number from a list
#the statement below DOES NOT remove number at all
index:= hasElement(M[i,k],op(M[i,j]));
if index <> -1 and k <> j then
removeElement(M[i,k],index);
end if;
end do:
# now the horizontal numbers are eliminated
# cancel all possibilities in vertical
k:=1;
for k from 1 to 4 do
index:= hasElement(M[k,j],op(M[i,j]));
if index <> -1 and k <> i then
removeElement(M[k,j],index);
end if;
end do:
end if;
end do;
end do;
tester:=tester+1;
end do:
print (M);
end proc:
solveSudoku:=proc(M)
本地i;局部j;本地守门员;本地k;局部指数;
本地测试仪;
测试仪:=0;
而tester列表是不可变的;矩阵是可变的。要更正代码,需要替换该行
去除元素(M[k,j],指数)强>
具有
M[k,j]:=removeElement(M[k,j],索引)
如果您只是在调用过程的代码中放弃该值,那么向过程返回该值就没有意义了。这就是你所做的。矩阵是可变的,但列表不是。如前所述,solveSudoku
正在将列表作为后者的参数L
传递给removeElement
solveSudoku
中调用removeElement
的行可能应该这样使用
M[k,j] := removeElement(M[k,j],index);
或者,将M
传递给removelement
而不是条目M[k,j]
的值。即
removeElement(M, k, j, index);
在solveSudoku
中调用,然后在removelement
中调用
M[k,j] := [op(1..boundary-1,L),op(boundary+1..,L)]; return NULL;
当然,您应该只采用其中一种方法:第一种方法是在solveSudoku
中更新条目M[k,j]
,第二种方法是在removeElement
中更新条目
注意。当您调用类似于F(…,M[k,j],…)
的过程时,您正在将矩阵项M[k,j]
的值传递给F
。但是,当您调用likeF(…,M…)
时,实际上是在通过引用传递矩阵M。看起来removeElement返回一个新数组,而不是修改现有数组。每次调用该过程时都需要使用返回值。
M[k,j] := [op(1..boundary-1,L),op(boundary+1..,L)]; return NULL;