Ir ao conteúdo
  • Cadastre-se

[Resolvido!] Verificação da coluna


Posts recomendados

No método que utilizei eu separei o vetor 9x9 em 9 regiões de 3x3. Passei cada região para um vetor de teste. E verifiquei se havia semelhanças no array. Aí vai o código completo pra você dar uma estudada. Compile para observar!

#include <stdio.h> //Para entrada e saíd de dados#include <stdlib.h> //Para srand() e rand()#include <time.h> //Para time()/** Essa função cria um novo vetor aleatório **/void inicializaSudoku(int vet[9][9]) //Função global com parãmetro para um vetor 9x9{    int i, j, k, seek, //Varáveis de controle de loop    aux; //Variável que receberá o número aleatório a ser comparado    srand(clock()); //Cria a semente dos números aleatórios    vet[0][0] = rand()%9 + 1; //Inicia o primeiro valor do vetor pois não precisa ser comparado    //Loop de preenchimento do vetor, usando variável de preenchimento    /** Cria o vetor raiz **/    for (i=1; i<9; i++) //Variável 'i' recebe 1 pois o primeiro valor já foi iniciado    {        aux = rand()%9 + 1; //Auxiliar recebe novo valor        j = 0; //Inicia a variável usada no loop para comparação        while(j<i) //Enquanto todo array não é comparado        {            if(aux == vet[0][j]) //Se valor de auxiliar for igual a um que já existe no vetor            {                aux = rand()%9 + 1; //Auxiliar recebe novo valor                j = 0; //Reinicia a comparação            }            else //Se for diferente            {                j++; //Passa para a próxima comparação            }        }        //Se chegar nesse ponto é porque todos os números são diferentes        vet[0][i] = aux; //Posição no vetor recebe o valor válido    }    //Você pode aproveitar a própria sequência raiz para contruir o jogo    for(i=1; i<9; i++)    {        //Não pode repetir a primeira sequência, então        if(vet[0][i]-1 <= 0)// Se o valor do ponto do vetor for igual a 0        {            aux = vet[0][0] - 1; //Recebe o valor do primeiro ponto do vetor        }        else //Se não        {            aux = vet[0][i] - 1; //Recebe o ponto do vetor analisado        }        /** Como você começará de um ponto  no meio do array será necessário        rebubiná-lo para completar as outras lacunas **/        seek = 0; //define a sequencia como não rebubinada        for(j=aux, k=0; j<9; j++, k++)        {            vet[i][k] = vet[0][j]; //Ponto nulo do vetor recebe uma posição aleatória pré indicada            if(!seek) //Se não rebubinado            {                if(j >= 8)                {                    j = -1; // 'j' recebe uma posição antes do início normal do array                    seek = 1; //Indica rebubinação                }            }            else // Se já rebubinado            {                if(j >= aux) // Se 'j' for igual à posição aleatória inicial                {                    j = 99; //Completa o array                }            }        }    }    return; //Encerra função}/** Essa função checa se não há números repetidos numa região **/int quadrosOk(int vet[9][9]){    int i, j, k, l, m, //Controle de loop para alinhar região    c_x, c_y, //Controle de loop de regiões lidas    n, o, //Controle de loop de comparação de quadros    vet_aux[9]; //Vetor onde um quadro será alinhado    k = 0; //Iniciliza controladores de loop    l = 0;    m = 0;    for(c_x=0, c_y=0; c_x<3 && c_y<3; ) //Enquanto não checa todas as regiões    {        for(i=k; i<k+3; i++)        {            for(j=l; j<l+3; j++)            {                vet_aux[m] = vet[i][j]; //Alinha um quadro em um único arrray                m++;            }        }        for(n=0; n<9; n++)        {            for(o=0; o<9; o++)            {                if(n != o) //Isso é necessário para não comparar um item com ele mesmo                {                    if(vet_aux[n] == vet_aux[o]) //Se números iguais no vetor                    {                        return 0; //Retorna falso                    }                }            }        }        //Navegando nas regiões do vetor do sudoku        if(c_x < 2)        {            c_x++;            l = l + 3;        }        else        {            c_x = 0;            c_y++;            l = 0;            k = k + 3;        }        m = 0;    }    //Se nenhum número igual for achado retorna verdadeiro    return 1;}int main(){    int sudoku[9][9], //Há a necessidade de criar um vetor apropriado para a função    i, j;    do //Faça    {        inicializaSudoku(sudoku); //Crie um novo sudoku    } while(!quadrosOk(sudoku)); //Enquanto houver regiões com números repetidos    //Para mostrar o vetor do sudoku    for(i=0; i<9; i++)    {        for(j=0; j<9; j++)        {            printf("[%i] ", sudoku[i][j]);            if(j == 2 || j == 5)            {                printf(" | ");            }        }        if(i == 2 || i == 5)        {            printf("\n-----------------------------------------\n");        }        printf("\n");    }    return 0;}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!