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

Sign in to follow this  
GoodVibrationS

Mega Hiper Urgente

Recommended Posts

GoodVibrationS

Antes de mais quero desejar um bom natal e um feliz ano novo para o pessoal todo do forum.

Agora vem a parte seria da questao ( pelo menos para mim )

Vinha pedir ajudar pois tenho um trabalho pa entregar na segunda para a Faculdade sobre o SUDOKU em PASCAL....

O objectivo do trabalho para nota 20 é conseguir fazer de maneira que o programa, apos serem dados os numeros que veem inicialmente no soduko, resolva automaticamente o jogo...

Mas tb como o trabalho é mto puzado eu fico me apenas pelo 12 , que é fazer:

1- Fazer uma grelha com 81 celulas

2-utilizar as regras do sudoku de maneira que n haja o msm numero na msm linha ou na msm coluno e ainda ( o mais dificil de fazer, que eu ainda n consegui resolver neste trabalho) na mesma sub-grelha (3x3)

3- e aparecer em cada celula os numeros possiveis, que vao sendo iliminados enquanto se vai adicionando numeros novos

4- por ultimo escrever esses numeros logo na grelha em ves de pedir em que linha e coluno e qual o algarismos keremos colocar.

Eu sei que é muito dificil mas se ó menos alguem conseguisse ou encontrasse na net a parte da resoluçao da sub-grelha e como trabalhar automaticamente na grelha principal eu agradecia msm mto.

PS: se nao conseguir fazer isso ate segunda feira tenho d efazer a cadeira po ano pois o trabalho conta 50% da nota final

PS2: se n perceberem mto bem o que eu quis dizer e tiverem interessados em ajudar digam me qq coisa

Obrigado a todos

Abraço

Share this post


Link to post
Share on other sites
deathseeker25

Boas,

Em primeiro lugar bem-vindo ao forum GoodVibrationS. Aqui vais obter ajuda com certeza, mas precisas de mostrar o código que já realizaste, visto que uma das regras desta casa e não fazer o trabalho pelos outros, muito menos quando se trata de formação de futuros profissionais.

Posta lá o código que já fizeste e vamos fazer o nosso melhor...

Cumps

Share this post


Link to post
Share on other sites
vbmaster

O mais fácil é mesmo detectar se há um número igual na mesma fila horizontal, vertical e quadrado 3*3.

O algortimo de resolução é que não me entra na cabeça mesmo. Mas já temos alguma info de qualidade sobre sudoku no fórum, ao alcance de um search. :P

Fica bem :P ;):D

Share this post


Link to post
Share on other sites
GoodVibrationS

Aki fica a grelha, amanha a noite passo para aki o que eu ja tenho feito do programa

So que eu tenho de por as linhas mais grossas de maneira que sobresaem as submatrizes e tenho de pintar a grelha mas com as submatrizes em cruz

Aki fica a matriz principal:

program SDK(input,output);
uses crt, graph;
var
  I {, Mode} :integer;
  CAD:String;

procedure INIT(tinta, papel :byte);
  var GMODE, Gdrive:integer;
  begin
Gdrive := DETECT;
InitGraph(Gdrive, Gmode, '');
if GraphResult <> GrOK then Halt(1);
setbkColor(papel);
cleardevice;
setcolor(tinta);
  end;

procedure VERT(X,Y,L:integer);
(* Traca segmento recto vertical. Origem em X,Y e comprimento L (pixels) *)
  begin
line(X,Y,X,Y+L)
  end;

procedure HORIZNT(X,Y,L:integer);
(* Traca segmento recto horizontal. Origem em X,Y e comprimento L (pixels) *)
  begin
line(X,Y,X+L,Y)
  end;

  (* procedure SetLineStyle (EstiloDaLinha, Padrao, Espessura :word);
  SolidLn     = 0;
  DottedLn    = 1;
  CenterLn    = 2;
  DashedLn    = 3;
  UserBitLn   = 4;  (estilo de linha definido pelo utilizador)

  Padrao e' ignorado a nao ser q EstililoDaLinha = UserBitLn e simultanea/
											Espessura = NormWidth ou = ThickWidth

  NormWidth     = 1;
  ThickWidth    = 2;
  *)


  (* procedure SetTextStyle (Font, Direccao, TamanhoCaracter :word);

  DefaultFont   = 0;
  TriplexFont   = 1; ("stroked" fonts)
  SmallFont     = 2;
  SansSerifFont = 3;
  GothicFont    = 4;

  HorizDir  = 0;  (da esquerda p/ a direita)
  VertDir   = 1;  (de baixo p/ cima)

  TamanhoCaracter = 1, 2, ..., 10 (Tamanho NoRMAL= 1 p/ DefaultFont)
											 (              = 4 p/ TriplexFont)
  *)


  begin (*inicio do Progr.Princ.*)

  INIT(15,0);
  for I:=1 to 10 do
begin
 VERT(60*I,42,378);
 HORIZNT(60,42*I,540);
end;

{  RestoreCrtMode;
Clrscr; }
{  repeat until keypressed; }

{  RestoreCrtMode;
  writeln('Agora estah em modo TEXTO!');
  readln;
  write('Premir <ENTER> p- entrar em modo Grafico!'); readln;

  SetGraphMode(GetGraphMode);
  ClearDevice;                 }
  SetLineStyle(SolidLn{EstiloDaLinha}, 0{Padrao}, ThickWidth);
  HORIZNT(60,42,540);
{  readln;
  }
  HORIZNT(60,168,540);
{  readln;
}
  HORIZNT(60,294,540);
{  readln;
}
  HORIZNT(60,420,540);
{ readln;

}
  vert(60,42,378);

{ readln;
}
  vert(240,42,378);

{ readln;
}
  vert(420,42,378);

{ readln;
}
  vert(600,42,378);

{
ClearDevice;
  }
  for I:=1 to 10 do
begin
 SetTextStyle(DefaultFont, HorizDir, I);
 str(I:1,CAD);
 outtextxy(I*45,36,CAD);
 SetTextStyle(DefaultFont, HorizDir, 1);
end;
  readln;

  CloseGraph
end. 

PS: algumas partes tem a explicar pk isso foi tipo uma ficha que nos deram e disseram para acabarmos e colocarmos dps a funcionar com o resto do programa..... amanha ca estara o programa

PS2: Fiz varios search, n so aki, e n encontrei mesmo nada que consiga me ajudar a resolver, pelo menos a parte onde n pode haver o msm numero na msm submatriz.

Obrigado a Todos

Abraço

Share this post


Link to post
Share on other sites
GoodVibrationS

Aqui ta entao o que ja fiz do programa....

Já fiz a eliminaçao de numeros repetidos nas linhas e colunas

O problema agora é 1-a eliminaçao de numeros iguais na msm submatriz (3x3) 2- e ainda a utilizaçao do grafico ( grelha ) dentro do programa mostrando os numeros ainda possiveis, ou seja, trabalharmos, colocarmos os numeros ja na grelha....

PS: esta parte do trabalho que tenho de fazer é apenas parcial como ja tinha referido anteriormente ( nota 12 ), ou seja, mostrar os numeros possiveis, dentro de cada celula e nao a resoluçao completa do sudoku

Aqui vai a parte do trabalho que fiz:

Program SUDOKU;
Uses CRT,graph;

type cubo=array [1..9,1..9,1..9] of boolean;
Var Semaforo:boolean;
SouN:char;
Iii,Nentradas,N,I,I1,J1,K1,J,K,dados1,ITab {, Mode} :integer;
Sudo:cubo;
A:cubo;
CAD:String;

{PASSWORD}
Procedure password(var semaforo:boolean);
Var Password:string;
Begin
Clrscr;
Repeat
        Gotoxy(0,5);Write('Insira a Password  ');Readln(Password);
        If (Password<>'Chacal') then
                Begin
                gotoxy(0,5);write('Incorrecto  ')
                End;
        Writeln(password);

until (Password='Chacal');
semaforo:=true;
end;


{Limpar Sudo}
Procedure Limpacubo(var A:cubo);
Begin
Clrscr;
For I:=1 to 9 do
        For J:=1 to 9 do
                For K:=1 to 9 do
                        A[i,J,K]:=true;
end;


{Atribuir Valores}
Procedure dados(var dados1:integer;var A:cubo);
Var dados:integer;
Begin
Clrscr;
Repeat
        Repeat
        Gotoxy(5,8);Write('':40);
        Gotoxy(5,8);Write('Quantos n§ vai introduzir? ');Read(N);
        Until N in [1..81];
        For Iii:=1 to N do
           Begin
             Repeat
                Repeat
                        Gotoxy(5,10);Write('Qual o ',Iii,' n§ da linha? (1-9) ');Read(I1);
                Until I1 in [1..9];
                Repeat
                        Gotoxy(5,12);Write('Qual o ',Iii,' n§ da coluna? (1-9) ');Read(J1);
                Until J1 in [1..9];
                Repeat
                        Gotoxy(5,15);Write('Qual o ',Iii,' algarismo? (1-9) ');Read(K1);
                Until (K1 in [1..9]);
                If (A[i1,J1,k1]=false) then
                        Begin
                        Gotoxy(5,20);Write('Introduziu um n§ inv lido, coloque outro n§');
                        End;
             Until (A[i1,J1,K1]=true);
             For K:=1 to 9 do
                        If A[i1,J1,K]=true Then A[i1,J1,K]:=false;
             For J:=1 to J1-1 do
                        If A[i1,J,K]=true Then A[i1,J1,K]:=false;
             For J:=J1+1 to 9 do
                For K:=1 to 9 do
                        If A[i1,J,k]=true Then A[i1,J,K]:=false;
             For I:=1 to I1-1 do
                For K:=1 to 9 do
                        If A[i,J1,K]=true Then A[i,J1,K]:=false;
             For I:=I1+1 to 9 do;
                 For K:=1 to 9 do
                        If A[i,J1,K]=true Then A[i,J1,K]:=false;

             Readln;
           end;

        Repeat
        Gotoxy(10,5);Write('Terminou entrada do problema? (s-n)');Readln(SouN);
        SouN:=upcase(SouN);
        Until SouN in ['S','N'];
Until SouN='S'
end;





Procedure Intro;
Begin
Clrscr;
Gotoxy(30,5);TextColor(lightGreen);Write('SUDOKU 2005');
Gotoxy(30,6);TextColor(Green);Write('SUDOKU 2005');
Gotoxy(30,7);TextColor(darkGray);Write('SUDOKU 2005');

Gotoxy(10,15);TextColor(Yellow);Write('Trabalho Realizado por:');
Gotoxy(12,16);TextColor(White);Write('Filipe Silva n§ 30316');
Gotoxy(12,17);Write('Joao Fidalgo n§ ......');
Gotoxy(12,18);Write('Helder Gon‡alves n§ ......');
Gotoxy(12,19);Write('Serginho n§ ......');
Gotoxy(20,24);Write('         PARA CONTINUAR PRIMA ENTER...');
Readln;
end;

Obrigado a todos

Abraço

Share this post


Link to post
Share on other sites
GoodVibrationS

O trabalho ja avançou um bocado:

Só falta a nular os msm numeros na submatriz e colocar a grelha no programa de maneira a que os quadrados com os numeros 123456789 fiquem dentro de todas as celulas.

Outro problema que deve ser na parte do window dentro do programa é que so ta a aparecer no ecra as 3 primeiras linhas ( as outras tao la mas n aparecem

Aqui ta o programa:

Program SUDOKU;
Uses CRT,graph;

type cubo=array [1..9,1..9,1..9] of boolean;
Var Semaforo:boolean;
SouN:char;
Iii,Nentradas,N,I,I1,J1,K1,J,K,L,C,dados1,ITab {, Mode} :integer;
Sudo:cubo;
A:cubo;
CAD:String;

{PASSWORD}
Procedure password(var semaforo:boolean);
Var Password:string;
Begin
Clrscr;
Gotoxy(30,5);TextColor(lightGreen);Write('SUDOKU 2005');
Gotoxy(30,6);TextColor(Green);Write('SUDOKU 2005');
Gotoxy(30,7);TextColor(darkGray);Write('SUDOKU 2005');

Gotoxy(10,15);TextColor(Yellow);Write('Trabalho Realizado por:');
Gotoxy(12,16);TextColor(White);Write('Filipe Silva n§ 30316');
Gotoxy(12,17);Write('Joao Fidalgo n§ ......');
Gotoxy(12,18);Write('Helder Gon‡alves n§ ......');
Gotoxy(12,19);Write('Serginho n§ ......');

Repeat
Gotoxy(20,24);Write('         PARA CONTINUAR INSIRA A PASSWORD...');Readln(Password);
If (Password<>'Chacal') then
                Begin
                gotoxy(0,5);write('Incorrecto  ')
                End;
        Writeln(password);
until (Password='Chacal');
semaforo:=true;
end;





{Limpar Sudo}
Procedure Limpacubo(var A:cubo);
Begin
Clrscr;
For I:=1 to 9 do
        For J:=1 to 9 do
                For K:=1 to 9 do
                        A[i,J,K]:=true;
end;


{Atribuir Valores}
Procedure dados(var dados1:integer;var A:cubo);
Var dados:integer;
Begin
Repeat
Clrscr;
          Repeat
            Gotoxy(5,8);Write('':40);
            Gotoxy(5,8);Write('Quantos n§s vai introduzir? ');Read(N);
          Until N in [1..81];
          For Iii:=1 to N do
             Begin
                Repeat
                  Repeat
                      Gotoxy(5,10);Write('Qual o ',Iii,' n§ da linha? (1-9) ');Read(I1);
                  Until I1 in [1..9];
                  Repeat
                      Gotoxy(5,12);Write('Qual o ',Iii,' n§ da coluna? (1-9) ');Read(J1);
                  Until J1 in [1..9];
                  Repeat
                      Gotoxy(5,15);Write('Qual o ',Iii,' algarismo? (1-9) ');Read(K1);
                  Until (K1 in [1..9]);
                  If (A[i1,J1,k1]=false) then
                        Begin
                        Gotoxy(5,20);Write('Introduziu um n§ inv lido, coloque outro n§');
                        End;
                Until (A[i1,J1,K1]=true);

             For K:=1 to 9 do
                        A[i1,J1,K]:=false;
             For J:=1 to J1-1 do
                 For k:=1 to 9 do
                        A[i1,J,K1]:=false;
             For J:=J1+1 to 9 do
                For K:=1 to 9 do
                        A[i1,J,K1]:=false;
             For I:=1 to I1+9 do
                For K:=1 to 9 do
                        A[i,J1,K1]:=false;
             For I:=I1+1 to 9 do;
                 For K:=1 to 9 do
                        A[i,J1,K1]:=false;

              A[i1,j1,K1]:=true;

             Readln;
           end;

     Repeat
        Gotoxy(10,5);Write('Terminou entrada do problema? (s-n)');Readln(SouN);
        SouN:=upcase(SouN);
     Until SouN in ['S','N'];
Until SouN='S';



Clrscr;
for K:=1 to 9 do
         if a[i1,j1,k] = true then
            begin
            a[i1,j1,k]:=false;
            a[i1,j1,k1]:=true;
            end;

     for J:=1 to J1-1 do
         for k:=1 to 9 do
             if a[i1,J,K]=true then
                begin
                a[i1,J,K1]:=false;
                end;

     for J:=J1+1 to 9 do
         for K:=1 to 9 do
             if a[i1,j,k]=true then
                begin
                a[i1,j,k1]:=false;
                end;

     for I:=1 to I1-1 do
         for K:=1 to 9 do
             if a[i,j1,k]=true then
             begin
             a[i,j1,k1]:=false;
             end;

     for i:=i1+1 to 9 do
         for k:=1 to 9 do
             if a[i,j1,k]=true then
             begin
             a[i,J1,K1]:=false;
             end;
             Readln;
clrscr;
  Repeat
   For I:=1 to 9 do
     Begin
        For J:=1 to 9 do
          BEgin
          Window(10+J*4,10+I*4,12+J*4,13+I*4);

          Begin
             For K:=1 to 9 do
               Begin
               If A[i,J,K]<> false Then
               Write(K) else Write(' ');
               end;
          end;
        end;
     end;
     Until I=9;
     Repeat Until Keypressed;

end;

{





PROCEDURE Grelha(L,C:integer);

VAR L,C:Integer;

BEGIN

C:=6;
L:=2;

      Clrscr;
      Gotoxy(C,L+01); Write('    1     2     3     4     5     6     7     8     9   ');
      Gotoxy(C,L+02); Write(' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»');
      Gotoxy(C,L+03); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+04); Write('1º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+05); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+06); Write(' ºÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺ');
      Gotoxy(C,L+07); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+08); Write('2º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+09); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+10); Write(' ºÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺ');
      Gotoxy(C,L+11); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+12); Write('3º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+13); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+14); Write(' ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹');
      Gotoxy(C,L+15); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+16); Write('4º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+17); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+18); Write(' ºÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺ');
      Gotoxy(C,L+19); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+20); Write('5º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+21); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+22); Write(' ºÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺ');
      Gotoxy(C,L+23); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+24); Write('6º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+25); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+26); Write(' ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹');
      Gotoxy(C,L+27); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+28); Write('7º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+29); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+30); Write(' ºÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺ');
      Gotoxy(C,L+31); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+32); Write('8º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+33); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+34); Write(' ºÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄĺ');
      Gotoxy(C,L+35); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+36); Write('9º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+37); Write(' º     ³     ³     º     ³     ³     º     ³     ³     º');
      Gotoxy(C,L+38); Write(' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ');

      Readln;

end;


     }

Begin


password(semaforo);
Limpacubo(A);
dados(dados1,A);
end.

PS: ta tb no programa, mas ta em parenteses outro tipo de grelha..... o problema é coloca la a trabalhar.

se poderem ajudar agradecia bastante pois tenho de entregar na segunda feira o trabalho senao bem posso pensar em fazer a cadeira so po ano

Obrigado

Abraço

Share this post


Link to post
Share on other sites
deathseeker25

Boas,

Agora já podem usar as tags do syntax highlighting no forum, visto que o MOD já está instalado.

Share this post


Link to post
Share on other sites
Warrior

Vamos lá ajudar o rapaz a tirar um 20..

O meu trabalho de natal (11º ano) foi exactamente um programa que dado um sudoku o resolve.

Este site foi a minha maior fonte de inspiração: http://eddaardvark.co.uk/sudoku/sudokuindex.html

Atenção que não li o código postado pelo GoodVibrationS. Reparei que estava em modo gráfico, vou falar só do algoritmo.

Consideremos que para a resolução do sudoku existem vários passos (vou tentar explicar sucintamente o que diz no site, e aplicar no pascal, aconselho que leiam o site na mesma)

1º Começamos com uma matriz 9*9 (declarada como string), onde em cada célula existe o valor '123456789' (ou seja, vamos começar com a matriz completa e eliminar os valores de que temos a certeza.) Fazemos isso no segundo passo.

2º Vou dar um exemplo: depois de sabermos que existe um "1" na célula [1,1], podemos elimina-lo na 1ª linha, na 1ª coluna e na 1ª subgrelha

Como ja disseste que tinhas dificuldades em remover na 1ª subgrelha, posso-te explicar como fiz:

um procedimento, que recebendo a informação da célula onde um numero vai ser colocado, e esse mesmo numero, remove tudo na matriz. Não tenho aqui o código mas algo do género (atenção que não testei nem tenho nenhum compilador à mão)

procedure limpar(a:char;b,c:integer); //sendo "a" o numero, e "b" e "c" as suas coordenadas na matriz (x,y)
var i,l,k,y,z:integer;
begin

//eliminar "a" em toda a sua linha, notem que o procedimento é recursiva caso ao eliminar o "a" ele fique sozinho (se ao eliminar o "1" na ultima coluna, ela ficasse só com o "3", eliminariamos o "3" na primeira linha, ultima coluna e no subgrupo [1,3]
for i:=1 to 9 do
 if ((pos(a,matriz[b,i])>0) and (i<>c)) then begin
   delete(matriz[b,i],pos(a,matriz[b,i]),1);
   if length(matriz[b,i])=1 then limpar(matriz[b,i],b,i);
 end;

//constrois processo semelhante para eliminar na coluna
...

//eliminar no subgrupo
if ((b<=3) and (b>=1)) then l:=1;
if ((b<=6) and (b>=4)) then l:=4;
if ((b<=9) and (b>=7)) then l:=7;
if ((c<=3) and (b>=1)) then k:=1;
if ((c<=6) and (b>=4)) then k:=4;
if ((c<=9) and (b>=7)) then k:=7;
w:=l+2;
z:=k+2;
for l:=l to w do
 for k:=k to z do
   if ((pos(a,matriz[l,k])>0) and ((l<>b) and (k<>c)) then begin
     delete(matriz[l,k],pos(a,matriz[l,k]),1);
     if length(matriz[l,k])=1 then limpar(matriz[l,k],l,k);
   end;
end;

Este procedimente é semelhante ao que criei. Provavelmente vais ter alguns erros para corrigir pois não tenho aqui compilador e não o testei. A lógica está lá.

3º Esta fase é mais dificil de perceber, mas consideravelmente fácil de implantar.

Suponhemos que numa coluna, encontravamos os seguintes valores possiveis e ja encontrados:

3567

8

36

1

579

4

56

357

2

Apesar de na 5ª linha, existirem várias hipoteses, sabemos que teremos que colocar lá o 9, pois é a unica hipotese de ele aparecer nessa coluna. Depois de o fazer, aplicaríamos o passo atrás. -> limpar('9',5,4)

4º Esta é a parte onde entram os pares e as triplas (quem resolve sudokus à mão deve estar familiarizado com este conceito)

Leiam esta parte do site ( http://eddaardvark.co.uk/sudoku/sudokusolver.html#Pairs ) e não devem restar dúvidas

Espero que tenha ajudado.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.