• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Alvaro Martins

SuDoKu

6 mensagens neste tópico

Hi there,

Parabens pelo sistema e pelo projecto :confused:

Tenho uma questao para os programmers...

Terminei um programa para gerar puzzles de sudoku... de diversas dimensões... e gostaria de falar com alguem que tenha feito algum semelhante.. pois tou com um problema ao gerar o puzzle mascarado.. nao tem simetria que deve ter. a soluçao que uso irei mostrar se alguem estiver interessado.

Já vi um ou outro na net, mas nenhum tem a soluçao que pretendo ;)

Cumps,

Alvaro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hi there,

Parabens pelo sistema e pelo projecto ;)

Tenho uma questao para os programmers...

Terminei um programa para gerar puzzles de sudoku... de diversas dimensões... e gostaria de falar com alguem que tenha feito algum semelhante.. pois tou com um problema ao gerar o puzzle mascarado.. nao tem simetria que deve ter. a soluçao que uso irei mostrar se alguem estiver interessado.

Já vi um ou outro na net, mas nenhum tem a soluçao que pretendo :)

Cumps,

Alvaro

boas, na revista que foi lançada, Programar fala la de 1  site com codigo fonte  do sundoku em  Python, tv encontres la a tua resposta, ou nao...mas da 1 vista de olhos!!  :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deixo aqui um programa em C, para o sudoku, nao sei ao certo o que faz, nem sei se funciona, pois não o testei

#include <stdio.h>

# define N 3
# define N2 N*N
# define N4 N2*N2

int A[N2+1][N2+1],Rows[4*N4+1],Cols[N4*N2+1],Row[4*N4+1][N2+1];
int Col[N4*N2+1][5],Ur[N4*N2+1],Uc[4*N4+1],C[N4+1],I[N4+1],Node[N4+1];
int i,j,k,r,c,d,n=N4*N2,m=4*N4,x,y,s;
int max,min,clues,match;
char l[65]="-123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#*~";
FILE *file;

int main(int argc,char*argv[])
{
   if(argc<2)
   {
m5:
      printf("\nusage:suexco file\n\n");

      printf(" prints the number of solutions of the sudoku-puzzle in file\n");
      printf(" empty cells are -.* or 0 , other nondigit-characters are");
      printf(" ignored\n");exit(1);
   }

   if((file=fopen(argv[1],"rb"))==NULL)
   {
      fclose(file);
      printf("\nfile-error\n\n");
      goto m5;
   }
   i=0;
   for (x=1;x<=N2;x++) {
      for (y=1;y<=N2;y++) {
m1:
         if (feof(file)) {
            printf("\nonly %i sudoku-entries found in file %s\n",i,argv[1]);
            goto m5;
         }
         c=fgetc(file);
         j=0;
         if (c=='-' || c=='.'|| c=='0' || c=='*')
            goto m7;
         while (l[j] != c && j<=N2)
            j++;
         if(j>N2)
            goto m1;
m7:
         A[x][y]=j;
         i++;
      }
   }

   r=0;
   for (x=1;x<=N2;x++) {
      for (y=1;y<=N2;y++) {
         for (s=1;s<=N2;s++) {
            r++;
            Cols[r]=4;
            Col[r][1]=x*N2-N2+y;
            Col[r][2]=(N*((x-1)/N)+(y-1)/N)*N2+s+N4;
            Col[r][3]=x*N2-N2+s+N4*2;
            Col[r][4]=y*N2-N2+s+N4*3;
         }
      }
   }
   for (c=1;c<=m;c++)
      Rows[c]=0;
   for (r=1;r<=n;r++) {
      for(c=1;c<=Cols[r];c++) {
         x=Col[r][c];
         Rows[x]++;
         Row[x][Rows[x]]=r;
      }
   }
   for (i=0; i<=n; i++)
      Ur[i]=0;
   for (i=0; i<=m; i++)
      Uc[i]=0;
   for (x=1;x<=N2;x++) {
      for (y=1;y<=N2;y++) {
         if(A[x][y]) {
            clues++;
            r=x*N4-N4+y*N2-N2+A[x][y];
            for(j=1;j<=Cols[r];   j++) {
               d=Col[r][j];
               Uc[d]++;
               for (k=1;k<=Rows[d];k++) {
                  Ur[Row[d][k]]++;
               }
            }
         }
      }
   }

   i=0;
m2:
   i++;
   I[i]=0;
   min=n+1;
   for (c=1;c<=m;c++) {
      if (Uc[c]==0) {
         match=0;
         for (r=1;r<=Rows[c];r++) {
            if (Ur[Row[c][r]]==0)
               match++;
         }
         if(match<min) {
            min=match;
            C[i]=c;
         }
      }
   }
   if (min==0 || min>n)
      goto m4;
m3:
   c=C[i];
   I[i]++;
   if (I[i] > Rows[c])
      goto m4;
   r=Row[c][i[i]];
   if (Ur[r])
      goto m3;
//x=(r-1)/N4+1;y=((r-1)%N4)/N2+1;s=(r-1)%(N2)+1;A[x][y]=s;if(clues+i==N4)output;
   for (j=1;j<=Cols[r];j++) {
      d=Col[r][j];
      Uc[d]++;
      for (k=1;k<=Rows[d];k++)
         Ur[Row[d][k]]++;
   }
   Node[i]++;
   goto m2;
m4:
   i--;
   c=C[i];
   r=Row[c][i[i]];
   for (j=1;j<=Cols[r];j++) {
      d=Col[r][j];
      Uc[d]--;
      for (k=1;k<=Rows[d];k++)
      {
         Ur[Row[d][k]]--;
      }
   }
   if(i>0)
      goto m3;
   printf("\n%i solutions\n",Node[N4-clues]);
}

Fonte : http://www.setbb.com/sudoku/viewtopic.php?t=119&mforum=sudoku

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lá está uma coisa que eu a seu tempo vou fazer... um programa para resolver sudokus

Mas agora n há tempo p isso. Nas ferias grandse talvez

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Uma coisa é certa o processador foi feito para processar, mas esses fors até metem medo :cheesygrin:. Eu acho que fiquei fan mas pronto tenho de recomendar, dá uma vista de olhos em prolog e repara que a matemática nao é só numeros :) Apenas um conselho de optimização :)

Fica bem, boas sorte

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora