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

Código:
5 0 0 6 0 0 9 0 0
0 0 2 0 0 5 0 0 8
1 9 0 0 0 2 0 0 0 
0 0 0 7 0 0 4 0 3 
0 0 6 8 0 0 7 0 0 
0 1 0 0 2 0 8 5 6 
9 0 1 0 3 7 0 8 4 
0 8 0 0 0 9 6 0 0 
3 0 5 0 0 0 1 0 9
[/QUOTE]

Algo que veo a simple vista, la matriz cargada en la linea 136 se llama t, luego la referencias por m