Ir ao conteúdo
  • Cadastre-se

C Solução do jogo Sudoku


amissadai

Posts recomendados

estou com um problema no meu jogo e já tentei encontrar o erro mais não acho. O meu tabuleiro gera no máximo 39 números respeitando as regras do sudoku .Se eu colocar mais de 39 números ele não roda. O problema que eu gostaria que vcs me ajudasse é que, quando eu rodo os 39 números e coloco eles em um solver, recebo a mensagem dizendo que o tabuleiro não tem solução. Pra 8 números por exemplo, tem. Meu código :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TAM 9

/*
/   Função que verifica se as linhas do jogo não tem elementos repetidos.
/   A função fica na linha que o usuário digitou e percorre toda coluna do
/   tabuleiro até achar os elementos repetidos. Quando achar esses 
    elementos, conta quantos tem.
*/
int verificaLinha(int tab[TAM][TAM], int verificaLinha, int valor){

    int linha = verificaLinha, coluna, conta_linha = 0;

    while(verificaLinha < linha + 1){
        coluna = 0;
        while(coluna < TAM){

            if(tab[verificaLinha][coluna] == valor){
                conta_linha = conta_linha + 1;
            }
            coluna = coluna + 1;
        }
        verificaLinha = verificaLinha + 1;
    }
    return conta_linha;
}

/*
    Função que verifica se as colunas do jogo não tem elementos repetidos.
    A função fica na coluna que o usuário digitou e percorre todas as linhas 
    do
    tabuleiro até achar os elemento repetidos. Quando achar esses elementos, 
    conta quantos tem.
*/

int verificaColuna(int tab[TAM][TAM], int verificaColuna, int valor) {

    int linha = 0, coluna, conta_coluna = 0;

    while(linha < TAM){

        coluna = verificaColuna;
        while(coluna < verificaColuna + 1){

            if(tab[linha][verificaColuna] == valor){
                conta_coluna = conta_coluna + 1;
            }
            coluna = coluna + 1;
        }
        linha = linha + 1;
    }
    return conta_coluna;
}

/*
Função que verifica se os blocos (MATRIZ 3X3) do jogo não tem elementos 
repetidos.
A função pega as linhas digitada pelo usuário divide por 3, onde temos a 
parte da divisão inteira. Depois multiplicamos essa parte inteira por 3.
Daí é só percorrer a linha com um while até esta mesma linha + 2. De modo 
análogo podemos fazer para as colunas.
*/

int blocoSudoku(int tabuleiro[TAM][TAM], int linha, int coluna, int valor){

    int conta_dentro_do_bloco=0, perc_linha, perc_coluna, aux_linha, 
    aux_coluna;

    perc_linha = (linha / 3) * 3;
    aux_linha = perc_linha + 2;

    while(perc_linha <= aux_linha){

        perc_coluna = (coluna / 3) * 3;
        aux_coluna = perc_coluna + 2;

        while(perc_coluna <= aux_coluna){

            if(tabuleiro[perc_linha][perc_coluna] == valor){
                conta_dentro_do_bloco = conta_dentro_do_bloco + 1;
            }

            perc_coluna = perc_coluna + 1;
        }
        perc_linha = perc_linha + 1;
    }
    return conta_dentro_do_bloco;
}

void preenche_matriz(int tabuleiro[TAM][TAM]) {

    //PREENCHE TODA MATRIZ COM ZEROS.

    int linha = 0, coluna;

    while(linha < TAM)
    {
        coluna = 0;
        while(coluna < TAM){
            tabuleiro[linha][coluna] = 0;
            coluna = coluna + 1;
        }
        linha = linha + 1;
    }
}

void gerarAleatorios(int tabuleiro[][TAM]){

    int aleatorio, linhaHorizontal, linhaVertical;
    int incremento = 0;

    while(incremento < 39){

        srand(time(NULL));
        aleatorio = rand()%9+1;
        linhaHorizontal = rand()%9;
        linhaVertical = rand()%9;

        while(tabuleiro[linhaHorizontal][linhaVertical] != 0){
            linhaHorizontal = rand()%9;
            linhaVertical = rand()%9;
        }

        while((blocoSudoku(tabuleiro, linhaHorizontal, linhaVertical, aleatorio)
                || verificaColuna(tabuleiro, linhaVertical, aleatorio)
                || verificaLinha(tabuleiro, linhaHorizontal, aleatorio)) != 0){

            aleatorio = rand()%9+1;
    }
    tabuleiro[linhaHorizontal][linhaVertical] = aleatorio;
    incremento = incremento + 1;
   }
}

void imprime(int tabuleiro[TAM][TAM]){

    //IMPRIMI O TABULEIRO NA TELA DO USUARIO.

    int linha = 0, coluna;

    while(linha < TAM){

        if((linha % 3) == 0){
            printf("-----------------------------------------------|\n");
        }
        coluna = 0;
        while(coluna < TAM){

            printf("  %d  ",tabuleiro[linha][coluna]);
            coluna = coluna + 1;

            if((coluna % 3) == 0){
                printf("|");
            }
        }
        printf("\n");
        linha = linha + 1;
    }
    printf("------------------------------------------------\n");
}

int main(){

    int tabuleiro[TAM][TAM];

    // Faz a chamada das funções.
    preenche_matriz(tabuleiro);
    gerarAleatorios(tabuleiro);
    imprime(tabuleiro);
    return 0 ;
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...