elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con programa que realiza sudokus
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con programa que realiza sudokus  (Leído 2,818 veces)
ogpg007

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda con programa que realiza sudokus
« en: 12 Marzo 2012, 03:42 am »

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 Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda con programa que realiza sudokus
« Respuesta #1 en: 12 Marzo 2012, 14:44 pm »

¡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 Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
Re: Ayuda con programa que realiza sudokus
« Respuesta #2 en: 12 Marzo 2012, 15:51 pm »

Usa la técnica del Backtracking!!. El código hecho por uno de mi univ. es el siguiente:

Citar

#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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[python][pygame] Programa que realiza la grafica de funciones.
Scripting
braulio-- 6 10,532 Último mensaje 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,550 Último mensaje 11 Enero 2011, 19:06 pm
por wolfbcn
Como saber las acciones que realiza un programa
Seguridad
engel lex 3 3,017 Último mensaje 6 Julio 2011, 05:54 am
por Novlucker
Creación de Sudokus « 1 2 »
Java
Valkyr 13 11,419 Último mensaje 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 11,699 Último mensaje 14 Enero 2017, 19:35 pm
por mc275
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines