Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Rodrigo Wasem Klein

Sudoku solver - problemas

Recommended Posts

Olá pessoal,

Estou realizando a construção de um programa em C para uma cadeira de minha faculdade, no entanto estou apresentando alguns problemas em sua execução.

Eu poderia ter realizado uma simplificação do programa, no entanto, como solicitado pelo professor, devo apresentar alguns recursos estudados,

como ponteiros para funções e alocação de memória.

Caso alguém consiga dar uma olhada e verificar possíveis erros, ficarei agradecido.

 

CÓDIGO:

 

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

int Matriz[9][9];

void Solucao(int,int);

typedef struct
{
int l;
int c;
int *v;
int aux;
}Sudoku;

int Alocar(Sudoku *Jogo)
{
(Jogo->v) = (int *)calloc(81,sizeof(int));
if(!(Jogo->v))
{
printf("** Erro: Memoria Insuficiente **");
exit(0);
}
}

void Desalocar(int *V, int (*func)(const int *))
{
(*func)(V);
}

int Montar(Sudoku *Jogo)
{
FILE *fp;
char arquivo[50];
int i,j=0,k=0,o;
do
{
printf("Digite uma das opções:\n\n\t1 - Ler do teclado;\n\n\t2 - Ler de arquivo(formatado semelhante ao jogo apresentado anteriormente).\n\nOpcao escolhida:");
scanf("%d", &o);
if(((o!=1)||(o!=2)))
{
printf("\n\n********OPCAO INVALIDA*******\n\n");
}
}while((o!=1)||(o!=2));
switch(o)
{
case1:
{
for(i=0;i<81;i++)
{
printf("\n\nLinha %d Coluna %d: ", j+1, k+1);
scanf("%d", &((Jogo->v)[i]));
j++;
if(!(j%9))
{
j=0;
k++;
}
}
break;
}
case2:
{
printf("Digite o nome do arquivo que contem os dados: ");
fgets(arquivo,49,stdin);
if (!(fp = fopen(arquivo,"r")))
{
printf("\n\nErro, nao foi possivel abrir o arquivo\n\n");
exit(0);
}
for(i=0;i<81;i++)
{
fscanf(fp,"\t%d",&((Jogo->v)[i]));
j++;
if(!(j%9))
{
j=0;
}
}
fclose(fp);
break;
}
}
}

void Troca(int l, int c)
{
if(c<8)
{
Solucao(l,c+1);
}
else
{
Solucao(l+1,0);
}
}

void Solucao(int col, int lin)
{
int i;
if(lin>8)
{
printf("\n\n\t*******SOLUCAO*******\n\n\t");
for(lin=0;lin<9;lin++)
{
for(col=0;col<9;col++)
printf("%5d",Matriz[lin][col]);
printf("\n\t");
}
printf("\n\n");
}
if(Matriz[col][lin]!=0)
{
Troca(lin,col);
}
else
{
for(i=0;i<9;i++)
{
if((Linha(lin,i)==1)&&(Coluna(col,i)==1)&&(Nove(lin,col,i)==1))
{
Matriz[lin][col]=(i+1);
Troca(lin,col);
}
}
}
}

int Linha(int l,int aux)
{
int c;
for(c=0;c<9;c++)
{
if(Matriz[l][c]==aux)
{
return 0;
}
return 1;
}
}

int Coluna(int c,int aux)
{
int l;
for(l=0;l<9;l++)
{
if(Matriz[l][c]==aux)
{
return 0;
}
return 1;
}
}

int Nove(int l,int c,int aux)
{
int li,co;
for(li=0;li<3;li++)
{
for(co=0;co<3;co++)
{
if(Matriz[l+li][c+co]==aux)
{
return 0;
}
}
}
return 1;
}

int main()
{
int i, j;
Sudoku *S;
(S->l)=9;
(S->c)=9;
int (*p)(const int *);
p=free;
printf("\t\tSOLUCIONADOR DE SUDOKU\n\n");
printf("A partir de um jogo de SUDOKU constituido por 9 linhas\ne 9 colunas de forma demonstrada por:\n");
printf("\n\t0\t0\tX\t0\tX\t0\t0\t0\tX");
printf("\n\tX\tX\t0\tX\t0\t0\t0\tX\t0");
printf("\n\t0\t0\tX\t0\t0\tX\tX\tX\t0");
printf("\n\t0\tX\tX\t0\tX\t0\t0\tX\tX");
printf("\n\tX\t0\t0\tX\t0\tX\tX\t0\t0");
printf("\n\t0\tX\t0\t0\tX\t0\tX\tX\t0");
printf("\n\t0\t0\tX\t0\t0\tX\tX\tX\t0");
printf("\n\t0\tX\tX\t0\tX\t0\t0\tX\tX");
printf("\n\tX\t0\t0\tX\t0\tX\tX\t0\t0");
printf("\n\nOnde X representam os numeros apresentados no jogo\ne 0 os espacos vazios.\n\n");
Alocar(S);
Montar(S);
for(i=0;i<8;i++)
{
for(j=0;j<9;j++)
{
Matriz[i][j]=((S->v)[(i*9+j)]);
}
}
Solucao(0,0);
Desalocar(S->v,p);
}

 

Desde já, agradeço a atenção.

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

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
Entre para seguir isso  





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

×