Advertisement
Guest User

Sudoku

a guest
Apr 7th, 2014
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.38 KB | None | 0 0
  1. # -*- coding: cp1252 -*-
  2.  
  3. class CSudoku (object):
  4.     __slots__ = ['__sol', '__fixed', '__size']
  5.     def __init__ (self, size):
  6.         self.__sol = [[0]*size for i in range(size)]
  7.         self.__fixed = [[False]*size for i in range(size)]
  8.         self.__size = size
  9.     def fill (self, row, column, value):
  10.         if row <= self.__size and row > 0 and column <= self.__size and column > 0 and value <= self.__size:
  11.             self.__sol[row-1][column-1] = value
  12.             self.__fixed[row-1][column-1] = True
  13.         else:
  14.             raise IndexError, "Invalid arguments."
  15.     def found (self, row, column, value):
  16.         f = False
  17.         for i in range(self.__size):
  18.             if value == self.__sol[row][i] or value == self.__sol[i][column]:
  19.                 return True
  20.         r = (int(row/3))*3
  21.         c = (int(column/3))*3
  22.         if (self.__sol[r+0][c+0] == value or self.__sol[r+0][c+1] == value or
  23.             self.__sol[r+0][c+2] == value or self.__sol[r+1][c+0] == value or
  24.             self.__sol[r+1][c+1] == value or self.__sol[r+1][c+2] == value or
  25.             self.__sol[r+2][c+0] == value or self.__sol[r+2][c+1] == value or
  26.             self.__sol[r+2][c+2] == value):
  27.             f = True
  28.         return f
  29.     def sudoku (self, row, column):
  30.         if not self.__fixed[row][column]: # Si la posició no està fixada.
  31.             for k in range(1, self.__size+1): # Provem de posar un nombre.
  32.                 found = self.found(row, column, k)
  33.                 if not found: # Si no es troba el nombre:
  34.                     self.__sol[row][column] = k
  35.                     if column == self.__size-1 and row != self.__size-1: # Arribem al final de la fila.
  36.                         self.sudoku(row+1, 0)
  37.                     elif column != self.__size-1:
  38.                         self.sudoku(row, column+1)
  39.                     else:
  40.                         print self
  41.                 self.__sol[row][column] = 0 # No s'ha trobat solució, següent iteració.
  42.         else:
  43.             if column == self.__size-1 and row != self.__size-1: # Arribem al final de la fila.
  44.                 self.sudoku(row+1, 0)
  45.             elif column != self.__size-1:
  46.                 self.sudoku(row, column+1)
  47.             else:
  48.                 print self
  49.     def __str__ (self):
  50.         text = '|+---+---+---++---+---+---++---+---+---+|\n'
  51.         for i in range(self.__size):
  52.             text += '|| '
  53.             for k in range(self.__size):
  54.                 if self.__sol[i][k] != 0:
  55.                     text += str(self.__sol[i][k])
  56.                 else:
  57.                     text += ' '
  58.                 text += ' |'
  59.                 if k in [2, 5, 8]:
  60.                     text += '|'
  61.                 text += ' '
  62.             text += '\n|+---+---+---++---+---+---++---+---+---+|\n'
  63.             if i in [2, 5]:
  64.                 text += '|+---+---+---++---+---+---++---+---+---+|\n'
  65.         return text
  66.  
  67. if __name__ == '__main__':
  68.     x = CSudoku(9)
  69.     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]]
  70.     for i in ls:
  71.         x.fill(*i)
  72.     print "Sudoku a solucionar:"
  73.     print x
  74.     print "Sudoku resolt:"
  75.     x.sudoku(0, 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement