Math 为什么我不能在程序中变异矩阵?

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;

我的任务是用Maple解决一个4x4数独难题。我构造了一个4x4矩阵,其每个元素都是一个列表。每个列表包含数字1、2、3、4。 我的算法是找到一个只包含一个数字的网格,并使用它来消除水平和垂直网格中列表中的相同数字

这是我的密码: 我使用了一个名为removeElement的过程来从列表中删除一个数字,但删除之后似乎是一样的。矩阵是不可变的吗?如何修复它? 此外,我还使用了一个名为tester的计数器来检查程序,以查看矩阵是否可更改

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
。但是,当您调用like
F(…,M…)
时,实际上是在通过引用传递矩阵M。

看起来removeElement返回一个新数组,而不是修改现有数组。每次调用该过程时都需要使用返回值。
M[k,j] := [op(1..boundary-1,L),op(boundary+1..,L)]; return NULL;