Autor
|
Tema: Ayuda con programa que realiza sudokus (Leído 3,032 veces)
|
ogpg007
Desconectado
Mensajes: 1
|
Hola! Soy un principiante en C y os quisiera preguntar para ver si me pudieres ayudar en este programa.
Lo que hago es definir la función llamada numeros, donde veo las posibilidades de realizar el sudoku ordenando los números de la manera respectiva, es decir, sin que se repitan numeros en cada fila o columna. Hasta el momento llevo esto:
/*Sudokus*/ #include <stdlib.h> #include <stdio.h> #include <conio.h> int x,y,num[9][9], i, h, j, k;
void numeros () { for (i=0; i<9; i++) { for (h=0; h<9; h++) { num[h]=(rand() % 9)+1; numh: for (j=1; j<h+1; j++) { if (num[h]==num[h-j]) { num[h]=(rand() % 9)+1; goto numh; } } numi: for (k=1; k<i+1; k++) { if (num[h]==num[i-k][h]) { num[h]=(rand()%9)+1; goto numi; } } } } }
void main () { clrscr (); numeros(); for (j=0; j<9; j++) { for (k=0; k<9; k++) { printf ("%d ", num[j][k]); } } getch(); }
Donde está verificando con perfección para que no se repitan números en las columnas, pero en las filas siempre tengo problemas y no sé por qué se dan. Gracias.
|
|
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas!
Si pretendes solucionar sudokus de esta forma, habra muchos casos en los que no puedas resolverlos. Por poner un ejemplo, si tienes dos numeros que ocupan dos casillas, aunque no sepas en que casilla va cada uno de los numeros, no tendrias en cuenta que en ninguna de esas dos casillas no puede ir ningun otro numero... (esto mismo puedes aplicarlo a tres numeros en tres casillas, cuatro...)
Lo mejor para solucionar cualquier sudoku sin sudar demasiado aplicando un monton de reglas añadidas a las basicas es utilizar backtracking con fuerza bruta. De esta forma incluso sabras si lo que tienes entre manos es un sudoku o si no lo es (por tener mas de una solucion)
¡Saludos!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
theluigy13etv
Desconectado
Mensajes: 179
Primero se hace, después se mejora
|
Usa la técnica del Backtracking!!. El código hecho por uno de mi univ. es el siguiente: #include<cstdio> #include<cstring> using namespace std; bool resuelto; int t[9][9]; bool Fil[9][10]; bool Col[9][10]; bool Cua[9][10]; void print(){ for(int i=0;i<9;++i){ for(int j=0;j<9;++j){ printf("%d",t[j]); } puts(""); } } void back(int fil,int col){ if(resuelto==true){ return; } if(fil==9){ resuelto=true; print(); return; } if(t[fil][col]>0){ back(col<8?fil:fil+1,col<8?col+1:0); return; } int cua=(fil/3)*3+col/3; for(int i=1;i<=9;++i){ if(Fil[fil]==true)continue; if(Col[col]==true)continue; if(Cua[cua]==true)continue; t[fil][col]=i; Fil[fil]=true; Col[col]=true; Cua[cua]=true; back(col<8?fil:fil+1,col<8?col+1:0); t[fil][col]=0; Fil[fil]=false; Col[col]=false; Cua[cua]=false; } } void caso(){ resuelto=false; memset(Fil,false,sizeof(Fil)); memset(Col,false,sizeof(Col)); memset(Cua,false,sizeof(Cua)); for(int i=0;i<9;++i){ for(int j=0;j<9;++j){ scanf("%1d",&t[j]); Fil[t[j]]=true; Col[j][t[j]]=true; Cua[(i/3)*3+j/3][t[j]]=true; } } //print(); //puts("***************"); back(0,0); } int main(){ int n; scanf("%d",&n); for(int i=0;i<n;++i){ caso(); } }
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[python][pygame] Programa que realiza la grafica de funciones.
Scripting
|
braulio--
|
6
|
10,801
|
27 Junio 2011, 00:11 am
por zZznewbiezZz
|
|
|
La nueva versión de Google Goggles te ayuda con los sudokus (entre otras cosas)
Noticias
|
wolfbcn
|
0
|
1,666
|
11 Enero 2011, 19:06 pm
por wolfbcn
|
|
|
Como saber las acciones que realiza un programa
Seguridad
|
engel lex
|
3
|
3,211
|
6 Julio 2011, 05:54 am
por Novlucker
|
|
|
Creación de Sudokus
« 1 2 »
Java
|
Valkyr
|
13
|
11,883
|
18 Enero 2012, 17:13 pm
por jhonatanAsm
|
|
|
programa sencillo que sume,reste multiplique y divide no me realiza la división
Programación C/C++
|
mc275
|
4
|
12,002
|
14 Enero 2017, 19:35 pm
por mc275
|
|