Código Python:
Ver original#Diego Abarca Gaspar
def leermatriz(fichero):
m=[]
f=open(fichero,'r')
for linea in f:
b=linea.split()
for i in range(len(b)):
b[i]=int(b[i])
m.append(b)
f.close()
return m
def escribematriz(fichero):
m=leermatriz(fichero)
t=''
for i in range(len(m)):
for j in range(len(m[i])):
t=t+str(m[i][j])
t=t+''
t=t+'\n'
print t
def esposibleFila(m,fila,col,num):
esposible=True
for j in range(len(m[fila])):
if m[fila][j]==num and j==col:
esposible=False
else:
return esposible
def esposibleColumna(m,fila,col,num):
esposible=True
for j in range(len(m[col])):
if m[j][col]==num and j==fila:
esposible=False
else:
return esposible
def EsPosibleCuadrado(m,fila,col,num):
esposible=True
filaIn=(fila/3)*3
colIn=(col/3)*3
for k in range(filaIn,filaIn+3):
for g in range(colIn,colIn+3):
if m[k][g]==num and k==fila and g==col:
esposible=False
else:
return esposible
def copiar(m):
h=[]
for i in range(len(m)):
fila=[]
for j in range(len(m[i])):
fila.append(m[i][j])
h.append(fila)
return h
def esposible(m,fila,col,num):
esposible=True
while esposibleFila(m,fila,col,num)==True and esposibleColumna(m,fila,col,num)==True and EsPosibleCuadrado(m,fila,col,num)==True:
return esposible
else:
esposible=False
def borrar(s,i,j,h):
#borra un numero de una celda no original
if h[i][j]!=0:
print 'la celda es original'
else:
s[i][j]=0
def dibuja(m,h):
p=copiar(h)
solucion=''
solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
for k in range(len(m)):
for l in range(3):
solucion=solucion+'||'
for t in range(len(m[k])):
for w in range(l*3+1,l*3+4):
if p[k][t]!=0:
solucion=solucion+str(m[k][t])
else:
if esposible(m,k,t,w):
solucion=solucion+str(w)
else:
solucion=solucion+'*'
if (t%3)!=2:
solucion=solucion+'|'
else:
solucion=solucion+'||'
solucion=solucion+'\n'
if (k%3)!=2:
solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
else:
solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
print solucion
def mostrar(m):
"""Funcion para mostrar la matriz m"""
pass
def sudoku_main():
fin=False
while not fin:
end=False
print 'Bienvenido'+'\n'+'Elija una de las siguientes opciones: '
print '1.Nuevo shudoku'
print '2.Continuar shudoku'
print '3.Salir'
opcion=raw_input('Elige una opción: ')
if opcion=='3':
fin=True
return 'Adios'
else:
if opcion=='1':
fichero=raw_input('nombre del fichero de sudoku: ')
m=leermatriz(fichero)
escribematriz(fichero)
porg=copiar(m)
elif opcion=='2':
fichero=raw_input('nombre del fichero guardado de sudoku: ')
t=leermatriz(fichero)
porg=copiar(t)
s=copiar(t)
else:
end=True
print '\n'
final=False
while not final:
print '¿Qué desea hacer?'
print '1.Poner numero'
print '2.Borrar numero'
print '3.Guardar shudoku'
print '4.Terminar'
opcion=raw_input('Elige una opción: ')
if opcion=='1':
f=int(raw_input('Fila: '))
col=int(raw_input('Columna: '))
num=int(raw_input('Número: '))
print '\n'
masposibilidades=True
if esposible(m,f,col,num):
m[f][col]=num
else:
print 'No es posible'
if masposibilidades:
dibuja(m,porg)
elif opcion=='2':
f=int(raw_input('Fila'))
col=int(raw_input('Columna'))
print '\n'
borrar(m,f,col,porg)
if masposibilidades:
dibuja(m,porg)
else:
mostrar(m)
elif opcion=='3':
nombre=raw_input('Introduzca el nombre del fichero: ')
f=open(nombre,'w')
for i in range(len(porg)):
for j in range(len(porg[i])):
f.write(str(porg[i][j])+' ')
f.write('\n')
for t in range(len(m)):
for n in range(len(m[t])):
f.write(str(m[t][n])+' ')
f.write('\n')
f.close()
elif opcion=='4':
final=True
win=True
f=0
while f<len(m) and win:
col=0
while col<len(m[f]) and win:
if m[f][col]==0:
win=False
else:
col=col+1
f=f+1
sudoku_main()
Le quite algunos errores que mostraba pydev, había una función que nunca se utilizaba y otra que no estaba, la agregue pero no la implemente.
En vez de poner un menu, con opciones te recomendaría algo estilo terminal, donde tenga comandos.
Puedes hacer algo como:
Código Python:
Ver originalcommands_table = {
'H': help,
'P': put_number,
'D': delete_number,
'N': new_game,
'C': continue_game,
'S': save_game,
'Q': quit_game,
}