Tema: Sudoku
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 15/05/2012, 13:14
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Sudoku

Código Python:
Ver original
  1. #Diego Abarca Gaspar
  2. def leermatriz(fichero):
  3.     m=[]
  4.     f=open(fichero,'r')
  5.     for linea in f:
  6.         b=linea.split()
  7.         for i in range(len(b)):
  8.             b[i]=int(b[i])
  9.         m.append(b)
  10.     f.close()
  11.     return m
  12.  
  13. def escribematriz(fichero):
  14.     m=leermatriz(fichero)
  15.     t=''
  16.     for i in range(len(m)):
  17.         for j in range(len(m[i])):
  18.             t=t+str(m[i][j])
  19.             t=t+''
  20.         t=t+'\n'
  21.     print t
  22.        
  23. def esposibleFila(m,fila,col,num):
  24.     esposible=True
  25.     for j in range(len(m[fila])):
  26.         if m[fila][j]==num and j==col:
  27.             esposible=False
  28.         else:
  29.             return esposible
  30.  
  31. def esposibleColumna(m,fila,col,num):
  32.     esposible=True
  33.     for j in range(len(m[col])):
  34.         if m[j][col]==num and j==fila:
  35.             esposible=False
  36.         else:
  37.             return esposible
  38.  
  39. def EsPosibleCuadrado(m,fila,col,num):
  40.     esposible=True
  41.     filaIn=(fila/3)*3
  42.     colIn=(col/3)*3
  43.     for k in range(filaIn,filaIn+3):
  44.         for g in range(colIn,colIn+3):
  45.             if m[k][g]==num and k==fila and g==col:
  46.                 esposible=False
  47.             else:
  48.                 return esposible
  49. def copiar(m):
  50.     h=[]
  51.     for i in range(len(m)):
  52.         fila=[]
  53.         for j in range(len(m[i])):
  54.             fila.append(m[i][j])
  55.         h.append(fila)
  56.     return h
  57.  
  58. def esposible(m,fila,col,num):
  59.     esposible=True
  60.     while esposibleFila(m,fila,col,num)==True and esposibleColumna(m,fila,col,num)==True and EsPosibleCuadrado(m,fila,col,num)==True:
  61.         return esposible
  62.     else:
  63.         esposible=False
  64.  
  65. def borrar(s,i,j,h):
  66.     #borra un numero de una celda no original
  67.     if h[i][j]!=0:
  68.         print 'la celda es original'
  69.     else:
  70.         s[i][j]=0
  71.        
  72. def dibuja(m,h):
  73.     p=copiar(h)
  74.     solucion=''
  75.     solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
  76.     solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
  77.     for k in range(len(m)):
  78.         for l in range(3):
  79.             solucion=solucion+'||'
  80.             for t in range(len(m[k])):
  81.                 for w in range(l*3+1,l*3+4):
  82.                     if p[k][t]!=0:
  83.                         solucion=solucion+str(m[k][t])
  84.                     else:
  85.                         if esposible(m,k,t,w):
  86.                             solucion=solucion+str(w)
  87.                         else:
  88.                             solucion=solucion+'*'
  89.                 if (t%3)!=2:
  90.                     solucion=solucion+'|'
  91.                 else:
  92.                     solucion=solucion+'||'
  93.             solucion=solucion+'\n'
  94.         if (k%3)!=2:
  95.             solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
  96.         else:
  97.             solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
  98.             solucion=solucion+'**---*---*---**---*---*---**---*---*---**'+'\n'
  99.     print solucion
  100.  
  101.  
  102. def mostrar(m):
  103.     """Funcion para mostrar la matriz m"""
  104.     pass
  105.    
  106.    
  107. def sudoku_main():
  108.     fin=False
  109.     while not fin:
  110.         end=False
  111.         print 'Bienvenido'+'\n'+'Elija una de las siguientes opciones: '
  112.         print '1.Nuevo shudoku'
  113.         print '2.Continuar shudoku'
  114.         print '3.Salir'
  115.         opcion=raw_input('Elige una opción: ')
  116.         if opcion=='3':
  117.             fin=True
  118.             return 'Adios'
  119.         else:
  120.             if opcion=='1':
  121.                 fichero=raw_input('nombre del fichero de sudoku: ')
  122.                 m=leermatriz(fichero)
  123.                 escribematriz(fichero)
  124.                 porg=copiar(m)
  125.             elif opcion=='2':
  126.                 fichero=raw_input('nombre del fichero guardado de sudoku: ')
  127.                 t=leermatriz(fichero)
  128.                 porg=copiar(t)
  129.                 s=copiar(t)
  130.             else:
  131.                 end=True
  132.  
  133.         print '\n'
  134.         final=False
  135.         while not final:
  136.                 print '¿Qué desea hacer?'
  137.                 print '1.Poner numero'
  138.                 print '2.Borrar numero'
  139.                 print '3.Guardar shudoku'
  140.                 print '4.Terminar'
  141.                 opcion=raw_input('Elige una opción: ')
  142.                 if opcion=='1':
  143.                     f=int(raw_input('Fila: '))
  144.                     col=int(raw_input('Columna: '))
  145.                     num=int(raw_input('Número: '))
  146.                     print '\n'
  147.                     masposibilidades=True
  148.                     if esposible(m,f,col,num):
  149.                         m[f][col]=num
  150.                     else:
  151.                         print 'No es posible'
  152.                     if masposibilidades:
  153.                         dibuja(m,porg)
  154.  
  155.  
  156.                        
  157.                 elif opcion=='2':
  158.                     f=int(raw_input('Fila'))
  159.                     col=int(raw_input('Columna'))
  160.                     print '\n'
  161.                     borrar(m,f,col,porg)
  162.                     if masposibilidades:
  163.                         dibuja(m,porg)
  164.                     else:
  165.                         mostrar(m)
  166.  
  167.        
  168.  
  169.                 elif opcion=='3':
  170.                     nombre=raw_input('Introduzca el nombre del fichero: ')
  171.                     f=open(nombre,'w')
  172.                     for i in range(len(porg)):
  173.                         for j in range(len(porg[i])):
  174.                             f.write(str(porg[i][j])+' ')
  175.                         f.write('\n')
  176.                     for t in range(len(m)):
  177.                         for n in range(len(m[t])):
  178.                             f.write(str(m[t][n])+' ')
  179.                         f.write('\n')
  180.                     f.close()
  181.  
  182.                 elif opcion=='4':
  183.                     final=True
  184.  
  185.                 win=True
  186.                 f=0
  187.                 while f<len(m) and win:
  188.                     col=0
  189.                     while col<len(m[f]) and win:
  190.                         if m[f][col]==0:
  191.                             win=False
  192.                         else:
  193.                             col=col+1
  194.                     f=f+1
  195.  
  196. 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 original
  1. commands_table = {
  2.     'H': help,
  3.     'P': put_number,
  4.     'D': delete_number,
  5.     'N': new_game,
  6.     'C': continue_game,
  7.     'S': save_game,
  8.     'Q': quit_game,
  9. }