Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # just edit INIT with a list of tuples in the form (i,j,n) for the fixed numbers
- # where i j represent row an col numbers (from 0 to 3)
- # and n is the number in that position
- # example INIT=((2,0,8),(2,3,11))
- # save and run this script with python
- INIT= ()
- class Matrix:
- sum = 34
- def __init__(self, numeros = ()):
- self.data = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
- self.fijos = []
- if isinstance(numeros, tuple):
- for t in numeros:
- i = t[0]
- if len(t) == 3: i = i*4 + t[1]
- n = t[len(t)-1]
- self.data[i] = n
- self.fijos.append(i)
- def __str__(self):
- r = ''
- for i in range(4):
- r += '[ %02d %02d %02d %02d ]' % (self.data[0+i*4], self.data[1+i*4], self.data[2+i*4], self.data[3+i*4])
- r += '\n'
- return r
- def __repr__(self):
- r = ''
- for i in range(4):
- r += '[ %02d %02d %02d %02d ]' % (self.data[0+i*4], self.data[1+i*4], self.data[2+i*4], self.data[3+i*4])
- r += '\n'
- return r
- def libre(self):
- if 0 in self.data:
- return self.data.index(0)
- else:
- return -1
- class Numeros:
- def __init__(self, numeros = ()):
- self.data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
- if isinstance(numeros, tuple):
- for t in numeros:
- n = t[len(t)-1]
- if n in self.data: self.data.remove(n)
- def __str__(self):
- r = '[ '
- for i in self.data:
- r += '%02d ' % n
- r += ']'
- return r
- def __repr__(self):
- r = '[ '
- for i in self.data:
- r += '%02d ' % n
- r += ']'
- return r
- def remove(self, n):
- if n in self.data:
- self.data.remove(n)
- return n
- def insert(self, n):
- for i in range(len(self.data)):
- if self.data[i] > n:
- self.data.insert(i,n)
- return
- self.data.append(n)
- class Solver:
- def __init__(self, m, n):
- if isinstance(m,Matrix):
- self.matrix = m
- else:
- self.matrix = Matrix()
- if isinstance(n,Numeros):
- self.numeros = n
- else:
- self.numeros = Numeros()
- def testRow(self, i):
- l = [self.matrix.data[i*4+x] for x in range(4)]
- if 0 in l: return 0
- if sum(l) == Matrix.sum: return 1
- return -1
- def testCol(self, i):
- l = [self.matrix.data[x*4+i] for x in range(4)]
- if 0 in l: return 0
- if sum(l) == Matrix.sum: return 1
- return -1
- def testDiag(self, t):
- l = [self.matrix.data[x] for x in (0,5,10,15)] if not t else [self.matrix.data[x] for x in (3,6,9,12)]
- if 0 in l: return 0
- if sum(l) == Matrix.sum: return 1
- return -1
- def test(self, n):
- res = 0
- i = n // 4
- j = n % 4
- resR = self.testRow(i)
- resC = self.testCol(j)
- resD = 1
- if n in (0,5,10,15): resD = self.testDiag(0)
- if n in (3,6,9,12): resD = self.testDiag(1)
- if -1 in (resR, resC, resD): return -1
- if (resR == resC == resD == 1) and not 0 in self.matrix.data: return 1
- return 0
- def resuelve(self):
- aux = self.numeros.data[:]
- i = self.matrix.libre()
- for n in aux:
- self.matrix.data[i] = n
- self.numeros.remove(n)
- res = self.test(i)
- if res == 0: res = self.resuelve()
- if res == 1: return 1
- self.numeros.insert(n)
- self.matrix.data[i] = 0
- #main
- matrix = Matrix(INIT)
- numeros = Numeros(INIT)
- solver = Solver(matrix, numeros)
- solver.resuelve()
- print(solver.matrix)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement