Informatika gyűjtemény

Egy szinttel feljebb tr_sudoku.pas

2004050607080910

NézetNyomtat

tr_sudoku.pas (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 2 KB
program opjdsa;
var t:array[1..9,1..9]of byte;
    v:array[1..9,1..9,1..9]of boolean;
    f:text;
    i,j,k:integer;
procedure beir(x,y:byte);
var a,b,i,j:integer;
begin
     for i:=1 to 9 do v[i,y,t[x,y]]:=false;
     for i:=1 to 9 do v[x,i,t[x,y]]:=false;
     a:=((x-1) div 3)*3+1;
     b:=((y-1) div 3)*3+1;
     for i:=to a+2 do for j:=to b+2 do v[i,j,t[x,y]]:=false;
end;
function kitolt:boolean;
var i,j,k,ss,sd,i2,j2,sd2:integer;
    b:boolean;
begin
     b:=false;
     for i:=1 to 9 do for j:=1 to 9 do
     begin
          if t[i,j]=0 then
          begin
               ss:=0; k:=1;
               while (ss<2)and(k<=9) do
               begin
                    if v[i,j,k] then begin ss:=ss+1; sd:=k; end;
                    k:=k+1;
               end;
               if ss<=1 then
               begin
                    t[i,j]:=sd;
                    beir(i,j);
                    b:=true;
               end;
          end;
     end;
     for i:=1 to 9 do
     begin
          for j:=1 to 9 do
          begin
               ss:=0; k:=1;
               while (ss<2)and(k<=9) do
               begin
                    if (v[i,k,j])and(t[i,k]=0) then begin ss:=ss+1; sd:=k; end;
                    k:=k+1;
               end;
               if ss=1 then
               begin
                    t[i,sd]:=j;
                    beir(i,sd);
                    b:=true;
               end;
          end;
     end;
     for i:=1 to 9 do
     begin
          for j:=1 to 9 do
          begin
               ss:=0; k:=1;
               while (ss<2)and(k<=9) do
               begin
                    if (v[k,i,j])and(t[k,i]=0) then begin ss:=ss+1; sd:=k; end;
                    k:=k+1;
               end;
               if ss=1 then
               begin
                    t[sd,i]:=j;
                    beir(sd,i);
                    b:=true;
               end;
          end;
     end;
     for i2:=0 to 2 do
         for j2:=0 to 2 do
             for k:=1 to 9 do
             begin
                  ss:=0;
                  for i:=i2*3+1 to i2*3+3 do
                      for j:=j2*3+1 to j2*3+3 do
                          if (t[i,j]=0)and(v[i,j,k]) then
                          begin
                               ss:=ss+1;
                               sd:=i; sd2:=j;
                          end;
                  if ss=1 then
                  begin
                       t[sd,sd2]:=k;
                       beir(sd,sd2);
                       b:=true;
                  end;
             end;
     kitolt:=b;
end;
begin
     assign(f,'sudoku1.be');
     reset(f);
     for i:=1 to 9 do readln(f,t[i,1],t[i,2],t[i,3],t[i,4],t[i,5],t[i,6],t[i,7],t[i,8],t[i,9]);
     close(f);
     for i:=1 to 9 do for j:= 1 to 9 do for k:=1 to 9 do v[i,j,k]:=true;
     for i:=1 to 9 do for j:=1 to 9 do if t[i,j]>0 then beir(i,j);
     while kitolt do;
     assign(f,'sudoku1.ki');
     rewrite(f);
     for i:=1 to 9 do begin for j:=1 to 9 do write(f,t[i,j],' ');writeln(f);end;
     close(f);
end.
(Vissza)