Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: cp1252 -*-
- class CSudoku (object):
- __slots__ = ['__sol', '__fixed', '__size']
- def __init__ (self, size):
- self.__sol = [[0]*size for i in range(size)]
- self.__fixed = [[False]*size for i in range(size)]
- self.__size = size
- def fill (self, row, column, value):
- if row <= self.__size and row > 0 and column <= self.__size and column > 0 and value <= self.__size:
- self.__sol[row-1][column-1] = value
- self.__fixed[row-1][column-1] = True
- else:
- raise IndexError, "Invalid arguments."
- def found (self, row, column, value):
- f = False
- for i in range(self.__size):
- if value == self.__sol[row][i] or value == self.__sol[i][column]:
- return True
- r = (int(row/3))*3
- c = (int(column/3))*3
- if (self.__sol[r+0][c+0] == value or self.__sol[r+0][c+1] == value or
- self.__sol[r+0][c+2] == value or self.__sol[r+1][c+0] == value or
- self.__sol[r+1][c+1] == value or self.__sol[r+1][c+2] == value or
- self.__sol[r+2][c+0] == value or self.__sol[r+2][c+1] == value or
- self.__sol[r+2][c+2] == value):
- f = True
- return f
- def sudoku (self, row, column):
- if not self.__fixed[row][column]: # Si la posició no està fixada.
- for k in range(1, self.__size+1): # Provem de posar un nombre.
- found = self.found(row, column, k)
- if not found: # Si no es troba el nombre:
- self.__sol[row][column] = k
- if column == self.__size-1 and row != self.__size-1: # Arribem al final de la fila.
- self.sudoku(row+1, 0)
- elif column != self.__size-1:
- self.sudoku(row, column+1)
- else:
- print self
- self.__sol[row][column] = 0 # No s'ha trobat solució, següent iteració.
- else:
- if column == self.__size-1 and row != self.__size-1: # Arribem al final de la fila.
- self.sudoku(row+1, 0)
- elif column != self.__size-1:
- self.sudoku(row, column+1)
- else:
- print self
- def __str__ (self):
- text = '|+---+---+---++---+---+---++---+---+---+|\n'
- for i in range(self.__size):
- text += '|| '
- for k in range(self.__size):
- if self.__sol[i][k] != 0:
- text += str(self.__sol[i][k])
- else:
- text += ' '
- text += ' |'
- if k in [2, 5, 8]:
- text += '|'
- text += ' '
- text += '\n|+---+---+---++---+---+---++---+---+---+|\n'
- if i in [2, 5]:
- text += '|+---+---+---++---+---+---++---+---+---+|\n'
- return text
- if __name__ == '__main__':
- x = CSudoku(9)
- ls = [[1,4,2], [1,6,3], [1,8,6], [1,9,5], [2,2,2], [2,3,7], [2,6,9], [3,6,5], [4,3,5], [5,1,7], [5,2,8], [5,8,9], [6,1,2], [6,3,3], [6,8,4], [7,1,3], [7,4,5], [7,5,7], [7,6,4], [7,7,8], [8,3,2], [8,6,6], [8,8,7], [8,9,9], [9,3,6], [9,6,2], [9,9,4]]
- for i in ls:
- x.fill(*i)
- print "Sudoku a solucionar:"
- print x
- print "Sudoku resolt:"
- x.sudoku(0, 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement