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

GoodVibrationS

Mega Hiper Urgente

8 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

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