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

时间:2014-10-03 22:28:51

标签: math logic sudoku discrete-mathematics maple

我的任务是使用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:

这是删除元素过程:

removeElement := proc(L,index)
    local boundary := index;
        if nops(L) <> 0 then
            return [op(1..boundary-1,L),op(boundary+1..,L)];
        end if;
    return [];
end proc;

2 个答案:

答案 0 :(得分:1)

列表是不可变的;矩阵是可变的。要更正代码,您需要替换该行 的 removeElement(M [K,J],索引); M [k,j]:= removeElement(M [k,j],index)

如果您只是在调用该过程的代码中丢弃该值,那么为过程返回值是没有意义的。这就是你在做什么。

答案 1 :(得分:0)

矩阵是可变的,但列表不是。发布后,solveSudoku将列表传递给removeElement作为后者的参数L

solveSudoku中您调用removeElement的行应该可以像这样使用,

M[k,j] := removeElement(M[k,j],index);

或者,将M传递给removeElement,而不是条目M[k,j]的值。即,

removeElement(M, k, j, index);

作为solveSudoku中的电话,然后是removeElement内的电话,

M[k,j] := [op(1..boundary-1,L),op(boundary+1..,L)]; return NULL;

当然,您应该采取以下方法之一:M[k,j]中更新条目solveSudoku的第一种方式,或removeElement中更新条目的第二种方式。

NB。当您调用类似F(...,M[k,j],...)的过程时,您将矩阵条目M[k,j]的值传递给F。但是当你打电话给F(...,M,...)时,你实际上是通过引用传递Matrix M.