Ir ao conteúdo

Posts recomendados

Postado

Alguém pode me ajudar ? Estou tendo dificuldades de fazer esse programa :

 

#include <stdio.h>

void leSudoku (int n, int sudoku [16] [16] )
{
    char s[2];
    int i, j, dim = n * n;
    for (i=0; 0< dim; i++)
    for (j=0; 0< dim; j++)
    {
        scanf("%s",&s);
        if (s[0] >= '1' && s[0] <='9'){
            sudoku[i][j] = s[0] - '0';}
        if (s[0] >= 'A' && s[0] <= 'G'){
            sudoku[i][j] = s[0] - 'A' + 10;}
    }
}

void imprimeLinha (int n)
{
    int i,j;
    for (i=0; i < n; i++)
    {
        printf ("+");
        for (j=0; j < n; j++)
        printf ("---");
}
printf ("+\n");
}

void imprimeSudoku (int n, int sudoku [16][16])
{
    int i, j, dim = n * n;
    imprimeLinha(n);
    for (i=0; i<dim; i++)
    {
       printf ("|");
       for (j=0; j < dim; j++)
       {
           int num=sudoku [i][j];
           if (num<=9)
           {
               printf ("%2d ",num);
           }
           else 
           {
               printf ("%2c ",num - 10 + 'A');
           }
           if ((j+1)%n == 0)
           {
            printf ("|");
           }
       } 
       printf("\n");
       if ((i+1)%n == 0)
       {
           imprimeLinha(n);
       }
    }
}

int sudokuOk (int n, int sudoku [16][16],int *lin,int *col)
{
    //PARTE QUE FALTA COMPLETAR
    return 1;
}

int main (void)
{
    int n, nlin, ncol, ok;
    int sudoku[16][16];
    scanf ("%d", &n);
    leSudoku(n,sudoku);
    imprimeSudoku(n,sudoku);
    ok = sudokuOk(n,sudoku,&nlin,&ncol);
    if (ok)
    {
        puts ("Sudoku Ok!");
    }
    else 
    {
        printf("Erro na posição (%d,%d)\n"), nlin, ncol; 
    }
    return 0;
}

O enredo desse programa :

O seu trabalho é criar um programa que leia um valor n, n = {2, 3, 4}, que determina a dimensão de uma matriz quadrada n² × n² e em seguida leia n^4 valores que preenchem uma matriz quadrada que representa um jogo de sudoku resolvido. A matriz pode ser 4 x 4 (se n =2), 9 x 9 (se n = 3) ou 16 x 16 (se n = 4). Com a matriz carregada na memória, o seu programa deve avaliar se o preenchimento está correto ou não, indicando a primeira linha e coluna onde foi encontrado o erro (se houver), ou a mensagem ”Sudoku Ok!”. Para o jogo de Sudoku 16 x 16, considere as letras A, B, C, D, E, F e G para representar os dígitos 10, 11, 12, 13, 14, 15 e 16, respectivamente.

 

Minha dificuldade é que não sei como fazer o programa verificar se todas linhas e colunas estão corretas .
 

  • Curtir 1
Postado

@MatheusCarvalho     olá ,    esse jogo de SoDoku tem como Regras não permitir a repetição de um mesmo dígito na mesma linha ou coluna do tabuleiro  ,   ,  assim , depois de preencher a matriz ,  você pode usar dois loop's aninhados e assim percorrer cada célula nas linhas verificando com o comando  "if"  ,  se tem algum número igual ao outro  e para isso use outro Loop para fazer as comparações até o final da linha , e caso encontre dois números iguais aí já pode parar as comparações usando o comando break , e mostrar a msg de erro e o número da linha e da coluna ,   mas o enunciado não diz , mas para ver se está realmente OK precisa  também depois de comparar as linhas e colunas precisa também comparar cada QuaDranTe para ver se tem algum número / DíGito repetido .

  • Curtir 2
Postado

@MatheusCarvalho

  e na função que lêlê a matriz sudoku tem erro de syntaxe , 

void leSudoku (int n, int sudoku [16] [16] ) 
{
    char s[2];
    int i, j, dim = n * n; // dim pode ser excluído colocando 
                           // na chamada da função n*n
    for (i=0; 0< dim; i++) // vai ler ethernamente , pois sempre 
    for (j=0; 0< dim; j++) // o valor de dim será o mesmo
      
e poderia ser assim  :
  
lersudoku(n*n,sudoku);     // chamar a função
  
void leSudoku (int n, int sudoku [16] [16] ) 
{
    char s[2];
    int i, j;
    for (i=0; i<n; i++) // vai ler ethernamente , 
    for (j=0; j<n; j++) // pois sempre o valor de dim será o mesmo
      

e corrigindo essa parte seu código ficou assim  :

#define _CRT_SECURE_NO_WARNINGS // para usar scanf e outras funcoes no visual studio
#include <stdio.h>
#include <time.h>
#include <Windows.h>
void leSudoku(int, int sudoku[16][16]);
void imprimeLinha(int);
void imprimeSudoku(int, int sudoku[16][16]);
int sudokuOk(int, int sudoku[16][16], int*, int*);
int main(void)
{
    srand(time(NULL));
    int n = 4, nlin = 0, ncol = 0, ok;
    int sudoku[16][16];
    //scanf("%d", & n);                                    // só para testar , depois remover
    leSudoku(n, sudoku);
    imprimeSudoku(n, sudoku);
    // ok = sudokuOk(n*n, sudoku, & nlin, & ncol);
    if (ok = sudokuOk(n * n, sudoku, & nlin, & ncol  )    )
    {
        puts("Sudoku Ok . . . !");                         // putzgrila !
    }
    else
    {
        printf("\n\npErro na posissAo ( %d , %d ) <---", nlin, ncol); // variáveis colocadas do Lsado de fora dos parenteses
    }
    printf("\n\n\n");
    return 0;
}
void leSudoku(int n, int sudoku[16][16])
{
    char s[2];
    int ii = 0;
    int i = 0, j = 0, dim = n * n;    // no VisuaL StudiO precisa inicializar as variaveis ao cria las
    for (i = 0; i < dim; i++)     // var i faltava
    {
        for (j = 0; j < dim; j++) // var j faltava
        {
            // scanf("%s", &s);   // AQui só para testar , depois remover então
        label_1:              // esse comando está em desuso , mas é du bom
            s[0] = (char)rand() % 16 + 48;
            if (s[0] >= '1' && s[0] <= '9')
            {
                sudoku[i][j] = s[0] - '0';
            }
            else
            {
                if (s[0] >= 'A' && s[0] <= 'G')
                {
                    sudoku[i][j] = s[0] - 'A' + 10;
                }
                else
                {
                    goto label_1; // esse comando está em desuso , mas ainda serve e é du bom
                }
            }
        }
    }
}

void imprimeLinha(int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        printf("+");
        for (j = 0; j < n; j++)
            printf("---");
    }
    printf("+\n");
}

void imprimeSudoku(int n, int sudoku[16][16])
{
    int i, j, dim = n * n;
    imprimeLinha(n);
    for (i = 0; i < dim; i++)
    {
        printf("|");
        for (j = 0; j < dim; j++)
        {
            int num = sudoku[i][j];
            if (num <= 9)
            {
                printf("%2d ", num);
            }
            else
            {
                printf("%2c ", num - 10 + 'A');  // o código ASCII de A  é 65
            }
            if ((j + 1) % n == 0)
            {
                printf("|");
            }
        }
        printf("\n");
        if ((i + 1) % n == 0)
        {
            imprimeLinha(n);
        }
    }
}

int sudokuOk(int n, int sudoku[16][16], int* lin, int* col)
{
    //PARTE QUE FALTA COMPLETAR
    int j = 0, i = 0, w = 0;                // melhor inicializar as variáveis
    for (i = 0; i < n; i++)           // percorrer as linhas
    {
        for (j = 0; j < n; j++)       // percorrer as colunas
        {
            for (w = j + 1; w < n; w++) // percorrer as colunas a partir de j ate o final da linha
            {
                if (sudoku[i][j] == sudoku[i][w])
                {
                    *lin = i;               // indireção de inteiro para ponteiro
                    *col = w;               // díGitos iguaIs é hum Erro no sudoku
                    return 0;               // retorna zero , pois tem erro , dígito Repetido
                }
            }
        }
    }
    return 1;                               // retorna hum pois não tem dígitos repetidos
}

 

  • Curtir 2
Postado

@devair1010 Pooh cara muito obrigado, ajudou dms. Mas eu tenho umas dúvidas ainda, no caso meu professor quer q o usuário insira os números e nesse programa ele está gerando automatico. Como faço para inserir os números manualmente ? E esse comando label ele serve pra que ?

  • Obrigado 1
Postado

@MatheusCarvalho    sim , outras formas , são com whle e do / while ou mesmo for  , e para inserir manualmente basta remover essa linha que gera os dígitos  automaticamente :

s[0] = (char)rand() % 16 + 48; // Aqui só para testar , depois remover então

e será muito trabalho digitar isso tudo ! ,  e a função ficaria assim  :

void leSudoku(int n, int sudoku[16][16])
{
    char s[2] = {};
    int achou = 0;
    int i = 0, j = 0, dim = n * n;            // no VisuaL StudiO precisa inicializar as variaveis ao cria las
    for (i = 0; i < dim; i++)                 // var i faltava
    {
        for (j = 0; j < dim; j++)             // var j faltava
        {
            // s[0] = (char)rand() % 16 + 48; // AQui só para testar , depois remover então
            do
            {   
                achou = 0;
                scanf("%s", &   s  );         // pega um digito do teclado           
                if (s[0] >= '1' && s[0] <= '9')
                {
                    sudoku[i][j] = s[0] - '0';
                }
                else
                { 
                    if (s[0] >= 'A' && s[0] <= 'G')
                    {
                        sudoku[i][j] = s[0] - 'A' + 10;
                    } 
                    else
                    {
                        achou = 1;
                    }
                }
            }while( achou );
        }
    }
}

  o Label_1  não é  o comando da linguagem c , não , ele é apenas uma referencia para o comando goto , e esse sim é da linguagem c , e de muitas outras linguagem ,  e ele serve para pular para alguma ponto  do programa onde estiver a referencia indicada por ele ,  por exemplo ali :

int main()
{
    int j = 255;
    goto L1;  // aqui o goto , que significa vá para
              // pula essa linha que vem logo depois dele
              // mas poderia pular várias linhas e ir para 
              // trás ou para frente no código
        j = j - 10;
    L1:       // aqui é a referencia para onde o goto ir
        printf("VaLor de jotah -> %d\n", j );
        printf("\n\n\n");
    return 0;
}

 

  • Curtir 1

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