Created
May 16, 2015 11:30
-
-
Save anonymous/04b13e36835fb4e10580 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/////////////////////////////////////////////////////////////////////////// | |
////////////////////////// Check Sudoku /////////////////////////////// | |
/////////////////////////////////////////////////////////////////////////// | |
function r=OneToNine(V) // function checks if the given vector V contains 1 to 9 | |
r = %T // this works | |
u = %F | |
index = 1 | |
while r == %T & index < 10 | |
for i=1 : length(V) | |
if V(i)==index then | |
u = %T | |
end | |
end | |
index=index+1 | |
if u == %F then r = %F | |
else u = %F | |
end | |
end | |
if length(V) > 9 then r = %F | |
end | |
endfunction | |
function y=check(M) // Checks if the given matrix M is a solved sudoku | |
y = %T // this works too | |
if size(M,1)<>9 | size(M,2)<>9 then // if it has more or less than 9 rows and columns | |
y = %F // we return false | |
end | |
for i=1 : size(M,1) // if not all rows have 1-9 we return false | |
if OneToNine(M(i,:)) == %F then | |
y = %F | |
end | |
end | |
endfunction | |
function P=PossibilitiesPosition(board, x, y) | |
// this one works | |
// we fill the vector possibilites with 9 zeros | |
// 0 means empty, 1 means it already has a value, so we don't need to change it | |
possibilities = [] // a vector that stores the possible values for position(x,y) | |
for t=1 : 9 // sudoku has 9 values | |
possibilities(t)=0 | |
end | |
// Check row f the value (x,y) for possibilities | |
// we fill the possibilities further by puttin '1' where the value is not possible | |
for i=1 : 9 // sudoku has 9 values | |
if board(x,i) > 0 then | |
possibilities(board(x,i))=1 | |
end | |
end | |
// Check column of the value (x,y) for possibilities | |
// we fill the possibilities further by puttin '1' where the value is not possible | |
for j=1 : 9 // sudoku has 9 values | |
if board(j, y) > 0 then | |
possibilities(board(j, y))=1 | |
end | |
end | |
// Check the 3x3 matrix of the value (x,y) for possibilities | |
// first we see which 3x3 matrix we need | |
k=0 | |
m=0 | |
if x >= 1 & x <=3 then | |
k=1 | |
else if x >= 4 & x <= 6 then | |
k = 4 | |
else k = 7 | |
end | |
end | |
if y >= 1 & y <=3 then | |
m=1 | |
else if y >= 4 & y <= 6 then | |
m = 4 | |
else m = 7 | |
end | |
end | |
// then we fill the possibilities further by puttin '1' where the value is not possible | |
for i=k : k+2 | |
for j=m : m+2 | |
if board(i,j) > 0 then | |
possibilities(board(i,j))=1 | |
end | |
end | |
end | |
P = possibilities | |
// we want to see the real values of the possibilities. not just 1 and 0 | |
for i=1 : 9 // sudoku has 9 values | |
if P(i)==0 then | |
P(i) = i | |
else P(i) = 0 | |
end | |
end | |
endfunction | |
/////////////////////////////////////////////////////////////////////////// | |
////////////////////////// Solve Sudoku /////////////////////////////// | |
/////////////////////////////////////////////////////////////////////////// | |
function S=solve(board) // the real solving function, here must be a problem somewhere | |
x=1 | |
y=1 | |
possibilities = [] // an empty vector to put in the possible value later on | |
if check(board) == %T then // if it's a fully solved sudoku the function gives the solution | |
S = board | |
else | |
for i=1 : 9 // sudoku has 9 values | |
for j=1 : 9 // sudoku has 9 values | |
if board(i,j)==0 then // if the value board(i,j) is empty so 0 | |
x=i // we put the coordinates in x and y | |
y=j // break means stop the loop | |
break | |
end | |
end | |
end | |
possibilities = PossibilitiesPosition(board,x,y) //we check the possibilities | |
for p=1 : 9 // sudoku has 9 values | |
if possibilities(p) > 0 then // if this is a possibility | |
board(x,y) = possibilities(p) // we put in that value | |
solve(board) // and we repeat until check(board) gives true | |
end | |
end | |
board(x,y)=0 // if we went trough al the possibilities | |
end // and there is still no solution we have to put that value back to 0 | |
// this is called backtracking | |
endfunction | |
////////////////////////////////////////////////////////////////////////////// |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment