123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #!/usr/bin/env python3
- from sudoku import Game
- MAX_V = 9
- class State:
- def __init__(self):
- resultboard = []
- for x in range(MAX_V):
- temprow = []
- for y in range(MAX_V):
- temprow.append(0)
- resultboard.append(temprow)
- self.resultboard = resultboard
- choicesboard = []
- # 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
- 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,move):
- state.resultboard[move['col']][move['row']] = move['num']
- 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 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__":
- node = State()
- while not goalTest(node):
- move=actions(node).pop()
- result(node,move)
- eliminateIllValues(node)
- print('Result found!')
|