Ir ao conteúdo
  • Cadastre-se

C Problema em C de Sudoku


ni89

Posts recomendados

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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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);
}

 

Link para o comentário
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!!

Link para o comentário
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.)

  • Curtir 1
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...