Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
ni89

C Problema em C de Sudoku

Recommended Posts

Alguém consegue resolver um problema em C do jogo sudoku?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Nesse sentido, elabore um algoritmo utilizando como modelo o tabuleiro abaixo.

    O usuário informará as coordenadas para as quais deseja efetuar a jogada (ex. linha 1, coluna 2)

    Posteriormente, o usuário, informará o número a ser testado (ex. 3)

    De acordo com a situação corrente do tabuleiro, o algoritmo deverá testar se o número informado é permitido ou não.

    Desafio: não permitir a inserção de números que irão comprometer a solução final do Sudoku. 

     

    image.png.364b89e393ccce0c1dce836ba1d3cfb8.png

     

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @MassakiMsk

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

    int resolverSudoku(int, int);
    void imprimirSudoku (void);
    int mesmacoluna (int, int, int), mesmalinha (int, int, int), mesmoquadro (int, int, int);

    int sudoku [9][9]= {4,0,0,8,0,0,0,0,1,
                        0,2,0,0,5,6,4,0,0,
                        1,8,0,0,0,7,0,2,3,
                        2,9,0,0,4,8,0,6,0,
                        0,0,4,0,0,1,9,0,0,
                        0,7,0,0,0,2,0,8,4,
                        6,3,0,2,0,0,0,1,5,
                        0,0,2,7,3,0,0,4,0,
                        7,0,0,0,0,5,0,0,9};

    int  main(){
        int x=0, y=0;

        imprimirSudoku();
        resolverSudoku(x,y);
        imprimirsudoku();

        return 0;
    }

    void imprimirSudoku(){
        for (int i=0; i<9; i++){
            for (int j=0; j<9; j++){
                printf("%d", sudoku[j]);
            }
            printf("\n");
        }
        printf("\n\n");
    }

    int resolverSudoku(int x, int y){
        int num=1;
        int tx=0;
        int ty=0;

        if(sudoku[x][y]!= 0){
            if (x == 8 && y == 8){
                return 1;
            }
        if (x<8){
            x++;
        } else{
            if ( y < 8{
                x=0;
                y++;
            }
        }
        
        if (sudoku[x][y] == 0){
            while (num < 10){
                if (!mesmalinha (x,y,num) && !mesmoquadro(x,y,num) && !mesmacoluna(x,y,num)){
                    sudoku[x][y] = num;
                    
                    if (x==8 && y==8){
                        return 1;
                    }
                    
                    if (x < 8){
                        tx= x + 1;
                    }else{
                        if (y<8){
                            tx=0;
                            ty= y+1
                        }
                    }
                    
                    if (resolverSudoku(tx,ty)){
                        return 1;
                    }
                    
                    
                }
                num++;
            }
        
        sudoku[x][y] = 0
        return 0;
        }

    }

    int mesmacoluna(int x, int)

    adicionado 27 minutos depois

    @MassakiMsk , @TYSQUARE89

     

    ESSE QUE EU QUERO QUE ME AJUDEM!

    O QUE FAÇO DEPOIS DISSO?

     

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

    #define LINHAS 9
    #define COLUNAS 9

    int tabuleiro[LINHAS][COLUNAS]=
    {
    {4, 0, 0, 8, 0, 0, 0, 0, 1},
    {0, 2, 3, 0, 5, 6, 4, 0, 0},
    {1, 8, 0, 0, 0, 7, 0, 2, 3},
    {2, 9, 0, 0, 4, 8, 0, 6, 0},
    {0, 0, 4, 0, 0, 1, 9, 0, 0},
    {0, 7, 0, 0, 0, 2, 0, 8, 4},
    {6, 3, 0, 2, 0, 0, 0, 1, 5},
    {0, 0, 2, 7, 3, 0, 0, 4, 0},
    {7, 0, 0, 0, 0, 5, 0, 0, 9}

    };


    int jLinha, jColuna, jValor;

    /*FUNÇÃO PRINCIPAL
    -------------------------------*/

    void main(){
        imprimirTabuleiro();
        jogada();
        tabuleiro[jLinha][jColuna] = jValor;
        imprimirTabuleiro();

    }

    /*IMPRIME A MATRIZ
    -------------------------------*/
    void imprimirTabuleiro(){
        int i, j;

        for(i = 0; i < LINHAS; i++ ){
            for(j = 0; j < COLUNAS; j++){
                printf("%d \t", tabuleiro[j]);
            }

            printf("\n");
        }


    }
    /*RECEBE A JOGADA
    -------------------------------*/

    void jogada (){
        printf("Informe a linha, coluna e valor: ");
        scanf("%d%d%d", &jLinha, &jColuna, &jValor);

    }

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @José Lucas Oliveira    para postar use o botão  <>   que está lá na barra de ferramentas da janela de responder, pois sem ele seu código fica faltando alguns caracteres ,   seu código apresenta alguns erros de compilação, então corrigi e está compilando, mas anda não entendi o que o jogo faz como é a jogada e quem ganha,  então seu código com algumas correções ficaria assim :

    #include <stdio.h>
    #include <stdlib.h>
    int resolverSudoku(int, int);
    void imprimirSudoku();
    int mesmacoluna(int x,int y,int k);
    int mesmalinha(int a,int b,int c);
    int mesmoquadro (int k,int w,int z);
    int sudoku [9][9]= {{4,0,0,8,0,0,0,0,1},
                        {0,2,0,0,5,6,4,0,0},
                        {1,8,0,0,0,7,0,2,3},
                        {2,9,0,0,4,8,0,6,0},
                        {0,0,4,0,0,1,9,0,0},
                        {0,7,0,0,0,2,0,8,4},
                        {6,3,0,2,0,0,0,1,5},
                        {0,0,2,7,3,0,0,4,0},
                        {7,0,0,0,0,5,0,0,9}};
    int i,j;
    int  main(){
        int x=0, y=0;
        imprimirSudoku();
        resolverSudoku(x,y);
        /*imprimirsudoku();*/
        return 0;
    }
    void imprimirSudoku(){
        for (i=0; i<9; i++){
            for (j=0; j<9; j++){
                printf("%d", sudoku[i][j]);
            }
            printf("\n");
        }
        printf("\n\n");
    }
    int resolverSudoku(int x, int y){
        int num=1;
        int tx=0;
        int ty=0;
        if(sudoku[x][y]!= 0){
            if (x == 8 && y == 8){
                return 1;
            }
        if (x<8){
            x++;
        } else{
            if ( y < 8){
                x=0;
                y++;
            }
        }
    
        if (sudoku[x][y] == 0){
            while (num < 10){
                if (!mesmalinha(x,y,num) && !mesmoquadro(x,y,num) && !mesmacoluna(x,y,num)){
                    sudoku[x][y] = num;
    
                    if (x==8 && y==8){
                        return 1;
                    }
    
                    if (x < 8){
                        tx= x + 1;
                    }else{
                        if (y<8){
                            tx=0;
                            ty= y+1;
                        }
                    }
    
                    if (resolverSudoku(tx,ty)){
                        return 1;
                    }
    
    
                }
                num++;
            }
    
        sudoku[x][y] = 0;
        return 0;
        }
        }
        return 0;
    }
    int mesmacoluna(int x,int y,int w){
        return 0;
    }
    int mesmalinha(x,y,num){
        return 0;
    }
    int mesmoquadro(x,y,num){
        return 0;
    }

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Consegue resolver esse outro?

    adicionado 1 minuto depois
    Sabe completar?
    
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #define LINHAS 9
    #define COLUNAS 9
    int tabuleiro[LINHAS][COLUNAS]=
    {
    {4, 0, 0, 8, 0, 0, 0, 0, 1},
    {0, 2, 3, 0, 5, 6, 4, 0, 0},
    {1, 8, 0, 0, 0, 7, 0, 2, 3},
    {2, 9, 0, 0, 4, 8, 0, 6, 0},
    {0, 0, 4, 0, 0, 1, 9, 0, 0},
    {0, 7, 0, 0, 0, 2, 0, 8, 4},
    {6, 3, 0, 2, 0, 0, 0, 1, 5},
    {0, 0, 2, 7, 3, 0, 0, 4, 0},
    {7, 0, 0, 0, 0, 5, 0, 0, 9}
    };
    
    int jLinha, jColuna, jValor;
    /*FUNÇÃO PRINCIPAL
    -------------------------------*/
    void main(){
        imprimirTabuleiro();
        jogada();
        tabuleiro[jLinha][jColuna] = jValor;
        imprimirTabuleiro();
    }
    /*IMPRIME A MATRIZ
    -------------------------------*/
    void imprimirTabuleiro(){
        int i, j;
        for(i = 0; i < LINHAS; i++ ){
            for(j = 0; j < COLUNAS; j++){
                printf("%d \t", tabuleiro[j]);
            }
            printf("\n");
        }
    
    }
    /*RECEBE A JOGADA
    -------------------------------*/
    void jogada (){
        printf("Informe a linha, coluna e valor: ");
        scanf("%d%d%d", &jLinha, &jColuna, &jValor);
    }

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @José Lucas Oliveira   Qual ?!

     

    adicionado 15 minutos depois

    @José Lucas Oliveira    esse código ? ,  para completar vai demorar ,  é preciso ir aos poucos fazendo uma função de cada vez ,  faça primeiro a função que imprime o tabuleiro  e pelo que pude entender nesse tabuleiro vai ter vários números de acordo com a jogada,  então imprimir o tabuleiro inicial .  aqui está imprimindo quatro colunas com números mas não sei se é isso mesmo que é para fazer :

    #include<stdio.h>
    #include<stdlib.h>
    #define LINHAS 9
    #define COLUNAS 9
    void imprimirTabuleiro();
    void jogada ();
    int tabuleiro[LINHAS][COLUNAS]=
    {
    {4, 0, 0, 8, 0, 0, 0, 0, 1},
    {0, 2, 3, 0, 5, 6, 4, 0, 0},
    {1, 8, 0, 0, 0, 7, 0, 2, 3},
    {2, 9, 0, 0, 4, 8, 0, 6, 0},
    {0, 0, 4, 0, 0, 1, 9, 0, 0},
    {0, 7, 0, 0, 0, 2, 0, 8, 4},
    {6, 3, 0, 2, 0, 0, 0, 1, 5},
    {0, 0, 2, 7, 3, 0, 0, 4, 0},
    {7, 0, 0, 0, 0, 5, 0, 0, 9}
    };
    
    int jLinha, jColuna, jValor;
    /*FUNÇÃO PRINCIPAL
    -------------------------------*/
    void main(){
        imprimirTabuleiro();
        jogada();
        tabuleiro[jLinha][jColuna] = jValor;
        imprimirTabuleiro();
    }
    /*IMPRIME A MATRIZ
    -------------------------------*/
    void imprimirTabuleiro(){
        int i, j;
        for(i = 0; i < LINHAS; i++ ){
            for(j = 0; j < COLUNAS; j++){
                printf("%d \t", tabuleiro[j]);
            }
            printf("\n");
        }
    
    }
    /*RECEBE A JOGADA
    -------------------------------*/
    void jogada (){
        printf("Informe a linha, coluna e valor: ");
        scanf("%d%d%d", &jLinha, &jColuna, &jValor);
    }

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @devair1010

    Tem que fazer de acordo com o problema que esta ali em cima:

     

    Elabore um algoritmo utilizando como modelo o tabuleiro abaixo.

    O usuário informará as coordenadas para as quais deseja efetuar a jogada (ex. linha 1, coluna 2)

    Posteriormente, o usuário, informará o número a ser testado (ex. 3)

    De acordo com a situação corrente do tabuleiro, o algoritmo deverá testar se o número informado é permitido ou não.

    Desafio: não permitir a inserção de números que irão comprometer a solução final do Sudoku. 

     

    image.png.f055844747aa645f110713963ce54486.pngSe puder me ajudar, agradecerei!!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    A parte um pouco mais complicada aí é checar se o número já está dentro do quadrado 3x3... Pra isso você precisa descobrir em qual quadrado as coordenadas estão.

     

    Com as coordenadas indo de 0 até 8 nas 2 direções, e (0, 0) ficando no canto esquerdo superior:

     

    sudoku0.png.454c8155310f34278a54ae48cf1f136d.png

     

    Cada quadrado com coordenadas (linha, coluna) estará dentro do quadrado 3x3 nos intervalos:

     

    linhas: (linha/3)*3 até (linha/3)*3+2

    colunas: (coluna/3)*3 até (coluna/3)*3+2

     

    Obs: As operações de divisão acima são divisões inteiras (ou seja, 5/3=1).

     

     

    Ex: O quadrado (5, 7) estará no quadrado 3x3 com intervalos indo de:

     

    (5/3)*3 = (1)*3 = 3

    e

    (7/3)*3 = (2)*3 = 6

     

    logo,

     

    linhas: 3 até 5

    colunas: 6 até 8

     

     

    Então basta percorrer a matriz 3x3 nesse intervalo e checar se o número digitado já está lá, pra checar se é uma posição válida.

     

    (E também fazer a mesma coisa para a coluna inteira e para a linha inteira, e se for válida em todos os casos o programa deixa o usuário colocar o número.)

    Editado por isrnick
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×