Tema: Sudoku
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/05/2012, 10: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

No entiendo. Por lo que lei quieres un programa que dado una instancia de sudoku lo resuelva, esto puede ser posible con ciertos algoritmos.

Pero, cuando vi tu código, vi que tenia interacción con un humano, así que lo quieres es programar el juego de sudoku, lo cual es diferente, por que solo tienes que checar las reglas en cada iteración.

Otra cosa no se por que pusiste los archivo en mediafire si los pudiste poner en el post.

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