Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jaua10 en 22 Noviembre 2014, 06:10 am



Título: Sudoku
Publicado por: Jaua10 en 22 Noviembre 2014, 06:10 am
Buenas noches estoy realizando un nuevo programa donde dada una matriz 9x9 el usuario pueda ingresar 3 numeros y posicionarlos donde quiera, una vez hecho esto los otros numeros deben generarse sin repetirse ni en filas ni en columnas del 1 al 9, llevo un adelanto pero no se como hacer para generar numeros aleatorio pero que no serepitan ni en filas ni en columnas esto sin usar la funcion random.

Código:
//fila j
//col i
#include <stdio.h>
#include <conio.h>
main()
{
int matriz[10][10],i,j;

for(i=1;i<10;i++)
{
for(j=1;j<10;j++)

matriz[j][i] = 0;
}
printf("Ingrese posicion de fila: ");
scanf("%d",&j);
while(j<1||j>9)
{
printf("\nEl numero ingresado no es valido para una fila");
printf("\nPorfavor reingrese un numero de fila: ");
scanf("%d",&j);
}
printf("\nIngrese posicion de columna: ");
scanf("%d",&i);
while(i<1||i>9)
{
printf("\nEl numero ingresado no es valido para una columna");
printf("\nPorfavor reingrese un numero de columna: ");
scanf("%d",&i);
}
printf("\nIngrese el valor para la posicion [%d][%d]: ",j+0,i+0);
scanf("%d",&matriz[j][i]);
printf("Ingrese posicion de fila: ");
scanf("%d",&j);
while(j<1||j>9)
{
printf("\nEl numero ingresado no es valido para una fila");
printf("\nPorfavor reingrese un numero de fila: ");
scanf("%d",&j);
}
printf("\nIngrese posicion de columna: ");
scanf("%d",&i);
while(i<1||i>9)
{
printf("\nEl numero ingresado no es valido para una columna");
printf("\nPorfavor reingrese un numero de columna: ");
scanf("%d",&i);
}
printf("\nIngrese el valor para la posicion [%d][%d]: ",j+0,i+0);
scanf("%d",&matriz[j][i]);
printf("Ingrese posicion de fila: ");
scanf("%d",&j);
while(j<1||j>9)
{
printf("\nEl numero ingresado no es valido para una fila");
printf("\nPorfavor reingrese un numero de fila: ");
scanf("%d",&j);
}
printf("\nIngrese posicion de columna: ");
scanf("%d",&i);
while(i<1||i>9)
{
printf("\nEl numero ingresado no es valido para una columna");
printf("\nPorfavor reingrese un numero de columna: ");
scanf("%d",&i);
}
printf("\nIngrese el valor para la posicion [%d][%d]: ",j+0,i+0);
scanf("%d",&matriz[j][i]);
printf("\n");

for(j=1;j<10;j++)
{
for(i=1;i<10;i++){
printf("%d\t",matriz[j][i]);
}
printf("\n");
}
getch();
return 0;
}

me podrian ayduar a como hacer para que en la matriz se generen el resto de los numeros aleatorios sin repetirse ni en filas ni en columnas, gracias de antemano


Título: Re: Sudoku
Publicado por: ivancea96 en 22 Noviembre 2014, 16:39 pm
Si te sirve de ayuda, aquí tienes un algoritmo recursivo para solucionar un sudoku (que viene siendo lo que intentas hacer tú):

http://norvig.com/sudoku.html (http://norvig.com/sudoku.html)


Título: Re: Sudoku
Publicado por: Jaua10 en 22 Noviembre 2014, 17:56 pm
gracias por tu sugerencia ivancea96, pero no puedo usar una funcion que genere numeros aleatorios, lo que quiero saber es que puedo hacer que me genere numeros q no se repitan ni en filas ni en columnas pero sin usar la funcion de random, alguna otra solucion o sugerencia?


Título: Re: Sudoku
Publicado por: zShackra en 22 Noviembre 2014, 18:48 pm
gracias por tu sugerencia ivancea96, pero no puedo usar una funcion que genere numeros aleatorios, lo que quiero saber es que puedo hacer que me genere numeros q no se repitan ni en filas ni en columnas pero sin usar la funcion de random, alguna otra solucion o sugerencia?

Lee por acá (http://benpfaff.org/writings/clc/random.html)...


Título: Re: Sudoku
Publicado por: engel lex en 22 Noviembre 2014, 19:13 pm
A medida que generas los numeros aleatorio ve comprobando en horizontal, vertical y cuadrado


Título: Re: Sudoku
Publicado por: Jaua10 en 22 Noviembre 2014, 19:33 pm
es posible que pueda hacer en mi codigo otra matriz y que vaya comprobando de acuedo a los numeros ingresados por el usuario y esta o no en esa fila y columna y de no se asi agregarlo? no se si me explico mi programa hasta el momento ingreso 3 numeros en las posiciones que yo deseo, pero luego de ingresar esos 3 numeros deberia de generar el resto de los numeros en las otra posiciones sin repetirse ni en filas ni en columnas, es posible hacer otra alternativa de comprobacion y que se vayan agregando tal vez una matriz mas? es que mi profesor no quiere que se agregue ninguna funcon que genere numeros aleatorios como rand() sdran() ni ningun otro sino que se haga de una manera manual, por eso es que se me dificulta un poco ya que no tengo al idea de como hacerlo y solo se me ocurrio lo de argar otra matriz, al menos que ustedes me ayuden o sugieran con otra cosa.Gracias de ante mano


Título: Re: Sudoku
Publicado por: ivancea96 en 22 Noviembre 2014, 22:17 pm
gracias por tu sugerencia ivancea96, pero no puedo usar una funcion que genere numeros aleatorios, lo que quiero saber es que puedo hacer que me genere numeros q no se repitan ni en filas ni en columnas pero sin usar la funcion de random, alguna otra solucion o sugerencia?

En ningún momento se generan números aleatorios en el link que pasé.

Eso demuestra que para nada lo miraste.


Título: Re: Sudoku
Publicado por: engel lex en 22 Noviembre 2014, 22:27 pm
A partir de 3 numeros es dificil... puedes generar una matriz base y con los numeros ingresados les das desplazamiento a la matriz


Título: Re: Sudoku
Publicado por: Jaua10 en 23 Noviembre 2014, 06:29 am
En ningún momento se generan números aleatorios en el link que pasé.

Eso demuestra que para nada lo miraste.

si lo vi ivancea96 solo que el profesor me lo manod de otra forma

Si podrian ayudarme a como hacer un recorrido? no tengo idea de como hacerlo porfavor.


Título: Re: Sudoku
Publicado por: zShackra en 23 Noviembre 2014, 07:03 am
Si te sirve de ayuda, aquí tienes un algoritmo recursivo para solucionar un sudoku (que viene siendo lo que intentas hacer tú):

http://norvig.com/sudoku.html (http://norvig.com/sudoku.html)

Recursividad es un tema que se dicta mucho después de arreglos... dudo mucho que le dejen usar el mismo.


Título: Re: Sudoku
Publicado por: Jaua10 en 23 Noviembre 2014, 07:27 am
Exacto por eso les pregunto xq no tengo idea de que mas podria hacer de acuerdo a mi nivel de conocimiento actual


Título: Re: Sudoku
Publicado por: engel lex en 24 Noviembre 2014, 01:17 am
Publiqué un tema de esto mismo hace poco pero en python 0% aleatorio

Ve el código,  analizalo y ve que puedes aplicar


Título: Re: Sudoku
Publicado por: Jaua10 en 24 Noviembre 2014, 04:13 am
Código
  1. import pprint
  2.  
  3. #crea array bidimensiona
  4. def create_matrix(m, n): return [[0]*n for _ in xrange(m)]
  5.  
  6. #gira la matriz ccw
  7. def rotar_matrix(matrix):
  8.  matrix_auxiliar = create_matrix(9,9)
  9.  for x in range(9):
  10.    for y in range(9):
  11.      matrix_auxiliar[y][x] = matrix[x][y]
  12.  return matrix_auxiliar
  13.  
  14.  
  15.  
  16. def generar_tablero(semilla):
  17.  #se genera un sudoku base sobre el que aplicar transformaciones
  18.  basesudoku = create_matrix(9,9)
  19.  for y in range(9):
  20.    for x in range(9):
  21.      basesudoku[y][x]= (x+(y%3)*3+(y/3))%9+1
  22.  #declaracion e inicializacion de variables
  23.  #variables de transformacion
  24.  #desplazamiento del 0 al 8
  25.  desplazamiento = 0
  26.  #rotacion del 0 al 3
  27.  rotacion = 0
  28.  #combinacion cada elemento del 0 al 5
  29.  combinacion = [0,0,0,0,0,0,0,0]
  30.  
  31.  #numero generatriz de 0 60466175
  32.  desplazamiento = semilla%9
  33.  semilla /=9
  34.  rotacion = semilla%4
  35.  semilla /=4
  36.  for i in range(8):
  37.    combinacion[i] = semilla%6
  38.    semilla /= 6
  39.  
  40.  #sudoku final
  41.  sudoku = create_matrix(9,9)
  42.  
  43.  #auxiliar para copiar elementos
  44.  auxiliar = create_matrix(3,9)
  45.  
  46.  #posibles combinaciones de 3 elementos
  47.  combinatorias = create_matrix(6,3)
  48.  combinatorias = [[0,1,2],[1,2,0],[2,0,1],[1,0,2],[0,2,1],[2,1,0]]
  49.  
  50.  #combinacion para cada elemento segun combinacion escogida
  51.  combinador = create_matrix (8,3)
  52.  for i in range(8):combinador[i] = combinatorias[combinacion[i]]
  53.  
  54.  #modificacion de matriz por desplazamiento lateral con desp
  55.  for y in range(9):
  56.    for x in range(9):
  57.      sudoku[y][x] = basesudoku[y][(x+desplazamiento)%9]
  58.  
  59.  #mecla lineas de 3 en 3 segun combinacion
  60.  for z in range(3):
  61.    for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
  62.    for y in range(3):
  63.      sudoku[z*3+y] = auxiliar[combinador[z][y]]
  64.  
  65.  #se copia sudoku en auxiliar
  66.  auxiliar = sudoku[:]
  67.  
  68.  #se mezclan los 3 renglones mayores
  69.  for z in range(3):
  70.    for y in range(3):
  71.      sudoku[z*3+y] = auxiliar[combinador[3][z]*3+y]
  72.  
  73.  #se rota la matriz para aplicar conversiones en otro eje
  74.  sudoku = rotar_matrix(sudoku)
  75.  
  76.  #se repite el proceso
  77.  for z in range(3):
  78.    for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
  79.    for y in range(3):
  80.      sudoku[z*3+y] = auxiliar[combinador[z+4][y]]
  81.  
  82.  auxiliar = sudoku[:]
  83.  
  84.  for z in range(3):
  85.    for y in range(3):
  86.      sudoku[z*3+y] = auxiliar[combinador[7][z]*3+y]
  87.  
  88.  #se endereza la matriz a su orientacion original
  89.  for i in range(3): sudoku = rotar_matrix(sudoku)
  90.  
  91.  #se le da la orientacion indicada en rot
  92.  for i in range(rotacion): sudoku = rotar_matrix(sudoku)
  93.  return sudoku
  94.  
  95. pprint.pprint( generar_tablero(0) )
  96.  

Si te soy sincero no sabría como tomar algo de alli a dev c++, entiendo algunas cosas pero no sabria como pasarla.


Título: Re: Sudoku
Publicado por: engel lex en 24 Noviembre 2014, 04:38 am
Pequeña introducción

Código
  1. for i in range(x)
Sería
Código
  1. for(i=0;i<x;i++)

De resto no hay llaves sino espacios a la izquierda y create_matrix es para crear un array bidimensional

Creo que hay debuggers online,intentalo  ;)


Título: Re: Sudoku
Publicado por: Jaua10 en 24 Noviembre 2014, 05:23 am
gracias mano