我的任務是使用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:
這裏是remove元素過程:
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;
它看起來像removeElement返回一個新的數組,而不是修改現有的。每次調用該過程時都需要使用返回值。 – 2014-10-03 22:45:41