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
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
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.
es raro ver un aporte tuyo . :P , se agradece. ;)