Eu fiz um resolvedor de Sudokus. Por enquanto ele só resolve os mais simples.
Ele foi feito em python, e para usá-lo:
python programa arquivo_com_sudoku
Os arquivos com sudoku são em modo texto. Um exemplo:
3,8,0,4,0,2,0,0,9
0,0,4,9,0,0,0,0,0
0,1,9,7,0,0,2,0,5
1,0,2,8,6,3,7,0,4
0,0,6,0,0,0,9,0,0
8,0,5,1,9,4,3,0,6
5,0,8,0,0,1,4,9,0
0,0,0,0,0,7,1,0,0
7,0,0,6,0,9,0,3,2
from sys import argv
from time import sleep
def inicia_matriz(file):
matriz = [[int(j) for j in i.split(',')] for i in file]
return matriz
def imprime_matriz (matriz):
print 'Resolvido!!!\n'
for i in matriz:
print ' '.join([str(j) for j in i])
print
def cria_conjunto_quadrante (matriz,x,y):
quad = []
for i in xrange((x/3)*3,(x/3+1)*3):
for j in xrange((y/3)*3,(y/3+1)*3):
if matriz[i][j] != 0:
quad.append(matriz[i][j])
return quad
def resolve (matriz):
#Criando um conjunto com valores de 1 a 9
sequencia = set(range(1,10))
for x,i in enumerate(matriz):
for y,j in enumerate(i):
# Se o elemento já existe não faz nada
if j == 0:
#cria um conjunto com todos os elementos da linha
linha = set(i)
linha.remove(0)
#cria um conjunto com todos os elementos da coluna
coluna = set([c[y] for c in matriz if c[y] != 0])
quad = cria_conjunto_quadrante(matriz,x,y)
try:
#Aqui é criado um conjunto com os elementos do quadrante
quad = set(quad)
#Diferença de conjuntos
temp = list(sequencia - (linha | coluna | quad))
#Verifica se a diferença é maior que 1. Se for ainda não o resultado
if len(temp) > 1:
continue
matriz[x][y]= temp[-1]
except:
matriz[x][y] = 0
def completo (matriz):
#Verifica se está completo.
for i in matriz:
#Caso exista um zero não esta completo
if 0 in i:
return False
return True
def main():
file = open (argv[-1])
matriz = inicia_matriz(file)
file.close()
while not completo(matriz):
resolve(matriz)
imprime_matriz(matriz)
main()