|
@@ -4,73 +4,72 @@ from sudoku import Game
|
|
|
|
|
|
MAX_V = 9
|
|
|
class State:
|
|
|
- """Represents a state of the environment"""
|
|
|
|
|
|
def __init__(self):
|
|
|
- elements = [x for x in range(MAX_SIZE**2)]
|
|
|
- shuffle(elements)
|
|
|
- self.matrix = [[elements[x+(y*MAX_SIZE)] for x in range(MAX_SIZE)] for y in range(MAX_SIZE)]
|
|
|
-
|
|
|
- def __iter__(self):
|
|
|
- self.row = 0
|
|
|
- self.col = 0
|
|
|
- return self
|
|
|
-
|
|
|
- def __next__(self):
|
|
|
- if self.row == MAX_SIZE:
|
|
|
- self.row = 0
|
|
|
- self.col = self.col+1
|
|
|
- if self.col == MAX_SIZE:
|
|
|
- raise StopIteration
|
|
|
- elem = self.matrix[self.col][self.row]
|
|
|
- self.row = self.row + 1
|
|
|
- return elem
|
|
|
+ resultboard = []
|
|
|
+ for x in range(MAX_V):
|
|
|
+ temprow = []
|
|
|
+ for y in range(MAX_V):
|
|
|
+ temprow.append(0)
|
|
|
+ resultboard.append(temprow)
|
|
|
+ self.resultboard = resultboard
|
|
|
|
|
|
- def printState(self):
|
|
|
- for i in range(MAX_SIZE):
|
|
|
- print(self.matrix[i])
|
|
|
- print("\n")
|
|
|
-
|
|
|
-class Solver:
|
|
|
- def __init__(self):
|
|
|
- self.tree = {}
|
|
|
- numbers = set()
|
|
|
choicesboard = []
|
|
|
- # Populate the numbers vector with values from 0 to MAX_V-1
|
|
|
- for x in range(MAX_V):
|
|
|
- numbers.add(str(x))
|
|
|
+ # Populate the numbers vector with values from 1 to MAX_V
|
|
|
+
|
|
|
# choicesboard is a bidimensional list with numbers for every element
|
|
|
for x in range(MAX_V):
|
|
|
row = []
|
|
|
for y in range(MAX_V):
|
|
|
+ numbers = set()
|
|
|
+ for value in range(1,10):
|
|
|
+ numbers.add(value)
|
|
|
row.append(numbers)
|
|
|
choicesboard.append(row)
|
|
|
self.choicesboard = choicesboard
|
|
|
- result = getBoard()
|
|
|
-
|
|
|
- def actions(state):
|
|
|
- actions = []
|
|
|
|
|
|
- return actions
|
|
|
+def actions(state):
|
|
|
+ actions = []
|
|
|
+ for row in range(MAX_V):
|
|
|
+ for col in range(MAX_V):
|
|
|
+ #Value not yet assigned
|
|
|
+ if state.resultboard[col][row] == 0:
|
|
|
+ #Add possible move
|
|
|
+ for num in state.choicesboard[col][row]:
|
|
|
+ move = {'col': col, 'row': row, 'num': num}
|
|
|
+ actions.append(move)
|
|
|
+ return actions
|
|
|
|
|
|
- #def result(state,action):
|
|
|
+def result(state,move):
|
|
|
+ state.resultboard[move['col']][move['row']] = move['num']
|
|
|
|
|
|
- #def goalTest(state):
|
|
|
+def goalTest(state):
|
|
|
+ incomplete = False
|
|
|
+ for row in range(MAX_V):
|
|
|
+ for col in range(MAX_V):
|
|
|
+ if state.resultboard[col][row] == 0:
|
|
|
+ imcomplete = True
|
|
|
+ return incomplete
|
|
|
|
|
|
- def eliminateIllValues(state):
|
|
|
- for row in range(MAX_V):
|
|
|
- for col in range(MAX_V):
|
|
|
- if result[col][row] != 0:
|
|
|
- # Eliminate duplicates numbers in a row
|
|
|
- for x in range(MAX_V):
|
|
|
- choicesboard[x][row].remove(result[col][row])
|
|
|
- # Eliminate duplicates numbers in a column
|
|
|
- for y in range(MAX_V):
|
|
|
- choicesboard[col][y].remove(result[col][row])
|
|
|
- # Eliminate duplicates in block (working only for 9x9 cells)
|
|
|
- #for y in range(MAX_V)
|
|
|
- # choicesboard[col][y].del(result[col][row])
|
|
|
+def eliminateIllValues(state):
|
|
|
+ for row in range(MAX_V):
|
|
|
+ for col in range(MAX_V):
|
|
|
+ if state.resultboard[col][row] != 0:
|
|
|
+ num = state.resultboard[col][row]
|
|
|
+ # Eliminate duplicates numbers in a row
|
|
|
+ for x in range(MAX_V):
|
|
|
+ state.choicesboard[x][row].remove(num)
|
|
|
+ # Eliminate duplicates numbers in a column
|
|
|
+ for y in range(MAX_V):
|
|
|
+ state.choicesboard[col][y].remove(num)
|
|
|
+ # Eliminate duplicates in block (working only for 9x9 cells)
|
|
|
+ #for y in range(MAX_V)
|
|
|
+ # choicesboard[col][y].del(state.resultboard[col][row])
|
|
|
|
|
|
-#if __name__ == "__main__":
|
|
|
-# while not goalTest(state):
|
|
|
-# for action in actions(node):
|
|
|
+if __name__ == "__main__":
|
|
|
+ node = State()
|
|
|
+ while not goalTest(node):
|
|
|
+ move=actions(node).pop()
|
|
|
+ result(node,move)
|
|
|
+ eliminateIllValues(node)
|
|
|
+ print('Result found!')
|