[Aporte] Código para generar tableros validos de sudoku

Iniciado por engel lex, 23 Noviembre 2014, 21:08 PM

0 Miembros y 1 Visitante están viendo este tema.

engel lex

Estaba buscando como resolver unos problemas y aprendiendo python (ya que puedo programar en android con QPython) asi que decidi hacer un metodo para generar tableros validos de sudoku, se genera un tablero original y con desplazamientos se lleva a la posición generada segun la semilla... la semilla genera (teoricamente) 60466175 tableros unicos

Si cualquier duda avisen

Código (python) [Seleccionar]
import pprint

#crea array bidimensiona
def create_matrix(m, n): return [[0]*n for _ in xrange(m)]

#gira la matriz ccw
def rotar_matrix(matrix):
 matrix_auxiliar = create_matrix(9,9)
 for x in range(9):
   for y in range(9):
     matrix_auxiliar[y][x] = matrix[x][y]
 return matrix_auxiliar



def generar_tablero(semilla):
 #se genera un sudoku base sobre el que aplicar transformaciones
 basesudoku = create_matrix(9,9)
 for y in range(9):
   for x in range(9):
     basesudoku[y][x]= (x+(y%3)*3+(y/3))%9+1
 #declaracion e inicializacion de variables
 #variables de transformacion
 #desplazamiento del 0 al 8
 desplazamiento = 0
 #rotacion del 0 al 3
 rotacion = 0
 #combinacion cada elemento del 0 al 5
 combinacion = [0,0,0,0,0,0,0,0]

 #numero generatriz de 0 60466175
 desplazamiento = semilla%9
 semilla /=9
 rotacion = semilla%4
 semilla /=4
 for i in range(8):
   combinacion[i] = semilla%6
   semilla /= 6

 #sudoku final
 sudoku = create_matrix(9,9)

 #auxiliar para copiar elementos
 auxiliar = create_matrix(3,9)

 #posibles combinaciones de 3 elementos
 combinatorias = create_matrix(6,3)
 combinatorias = [[0,1,2],[1,2,0],[2,0,1],[1,0,2],[0,2,1],[2,1,0]]

 #combinacion para cada elemento segun combinacion escogida
 combinador = create_matrix (8,3)
 for i in range(8):combinador[i] = combinatorias[combinacion[i]]

 #modificacion de matriz por desplazamiento lateral con desp
 for y in range(9):
   for x in range(9):
     sudoku[y][x] = basesudoku[y][(x+desplazamiento)%9]

 #mecla lineas de 3 en 3 segun combinacion
 for z in range(3):
   for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
   for y in range(3):
     sudoku[z*3+y] = auxiliar[combinador[z][y]]

 #se copia sudoku en auxiliar
 auxiliar = sudoku[:]

 #se mezclan los 3 renglones mayores
 for z in range(3):
   for y in range(3):
     sudoku[z*3+y] = auxiliar[combinador[3][z]*3+y]

 #se rota la matriz para aplicar conversiones en otro eje
 sudoku = rotar_matrix(sudoku)

 #se repite el proceso
 for z in range(3):
   for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
   for y in range(3):
     sudoku[z*3+y] = auxiliar[combinador[z+4][y]]

 auxiliar = sudoku[:]

 for z in range(3):
   for y in range(3):
     sudoku[z*3+y] = auxiliar[combinador[7][z]*3+y]

 #se endereza la matriz a su orientacion original
 for i in range(3): sudoku = rotar_matrix(sudoku)

 #se le da la orientacion indicada en rot
 for i in range(rotacion): sudoku = rotar_matrix(sudoku)
 return sudoku

pprint.pprint( generar_tablero(0) )





[Elektro]: Título corregido, ponía "odigo" :P
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

charlie2019

Se puede generar nuevos SUDOKU con Octave o Matlab con un algoritmo de no mas de 20 lineas de código. Este algoritmo consiste en partir de un SUDOKU completado -81 casillas completas- y desde este se generan tantos como se quiera x simple eliminacion de n casillas elegidas al azar. Es decir de una solucion se pasa x eliminacion a otro tablero para solucionar. Realmente este algotitmo se puede hacer con cualquier lenguaje d programación pues no tiene pretensiones de ningun calculo matem´tico.

**Aincrad**