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

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

@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

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

@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

×