Nombre Password [ Regístrate ]

Sopa de letras (OIE 5 - 2001) - Código en Pascal
program sopa_de_letras;
uses crt;

const
 max=99;
type
 encontrar= record
             palabra, palindromo: string[20];
             Xi,Xf,Yi,Yf: 1..max;
             encontrada: boolean;
            end;

var
 lista: array[0..max] of encontrar;
 hori, vert, diag1, diag2,
  diag3, diag4: array[1..99] of string[99];
 f:text;
 x, y, n: 0..max;
 i, j, posX, posY:byte;

procedure hacerpalindromo(a: byte);
{transforma una palabra en su palindromo}
var i: byte;
begin
 with lista[a] do
  for i:= length(palabra) downto 1 do
   palindromo:= palindromo + palabra[i];
end;

procedure leer_datos;
var i: byte;
begin
 assign(f, 'SOP.DAT');
 reset(f);
 read(f, x);
 readln(f, y);
 for i:= 1 to x do readln(f,hori[i]);
 readln(f, n);
 for i:=1 to n do
  begin
   readln(f, lista[i].palabra);
   hacerpalindromo(i);
  end;
 close(f);
end;

function diagonal(a, b: byte; dire:char):string;
{devuelve la diagonal a paritir de la posicion (a,b) en la direccion dire}
var linea: string;
begin
 linea:='';
 while (a<=x) and (b<=y) and (a>=1) do
  begin
   linea:=linea+hori[a][b];
   case dire of
    'I': inc(a);
    'D': dec(a);
   end;
   inc(b);
  end;
 diagonal:=linea;
end;

procedure vert_diag;
{haya las columnas, y las diagonales}
var
 i, j: byte;
begin
 for i:= 1 to y do
  begin
   for j:= 1 to x do
    vert[i]:= vert[i]+hori[j][i];
   if i<>1 then
    begin
     diag1[i-1]:=diagonal(1,i,'I');
     diag4[i-1]:=diagonal(x,i,'D');
    end;
  end;
 for i:= 1 to x do
  begin
   diag2[i]:=diagonal(i,1,'I');
   diag3[i]:=diagonal(i,1,'D');
  end;
end;
(******************PROCDIMIENTOS PARA HALLAR COORDENADAS*******************)
{cuando se encuentra una palabra o palindromo se hallan sus coordenadas
dependiendo de la fila columna o diagonal en que se haya encontrado}
procedure pahori;
begin
   lista[j].encontrada:=true;
   lista[j].Xi:=i;
   lista[j].Yi:=posY;
   lista[j].Xf:=lista[j].Xi;
   lista[j].Yf:=lista[j].Yi+length(lista[j].palabra)-1;
end;

procedure padia2;
begin
   lista[j].encontrada:=true;
   lista[j].Xi:= posY+i-1;
   lista[j].Yi:= posY;
   lista[j].Xf:= lista[j].Xi+length(lista[j].palabra)-1;
   lista[j].Yf:= lista[j].Yi+length(lista[j].palabra)-1;
end;

procedure padia3;
begin
   lista[j].encontrada:=true;
   lista[j].Xi:= i-posY+1;
   lista[j].Yi:= posY;
   lista[j].Xf:= lista[j].Xi-length(lista[j].palabra)+1;
   lista[j].Yf:= lista[j].Yi+length(lista[j].palabra)-1;
end;

procedure pohori;
begin
   lista[j].encontrada:=true;
   lista[j].Xf:=i;
   lista[j].Yf:=posY;
   lista[j].Xi:= lista[j].Xf;
   lista[j].Yi:= lista[j].Yf+length(lista[j].palabra)-1;
end;

procedure podia2;
begin
   lista[j].encontrada:=true;
   lista[j].Xf:= posY+i-1;
   lista[j].Yf:= posY;
   lista[j].Xi:= lista[j].Xf+length(lista[j].palabra)-1;
   lista[j].Yi:= lista[j].Yf+length(lista[j].palabra)-1;
end;

procedure podia3;
begin
  lista[j].encontrada:=true;
  lista[j].Xf:= i-posY+1;
  lista[j].Yf:= posY;
  lista[j].Xi:= lista[j].Xf-length(lista[j].palabra)+1;
  lista[j].Yi:= lista[j].Yf+length(lista[j].palabra)-1;
end;

procedure pavert;
 begin
   lista[j].encontrada:=true;
   lista[j].Xi:=posX;
   lista[j].Yi:=i;
   lista[j].Xf:=lista[j].Xi+length(lista[j].palabra)-1;
   lista[j].Yf:=lista[j].Yi;
 end;

procedure padia1;
 begin
   lista[j].encontrada:=true;
   lista[j].Xi:=posX;
   lista[j].Yi:=posX+i;
   lista[j].Xf:=lista[j].Xi+length(lista[j].palabra)-1;
   lista[j].Yf:=lista[j].Yi+length(lista[j].palabra)-1;
 end;

procedure padia4;
 begin
   lista[j].encontrada:=true;
   lista[j].Xi:=x-posX+1;
   lista[j].Yi:=posX+i;
   lista[j].Xf:=lista[j].Xi-length(lista[j].palabra)+1;
   lista[j].Yf:=lista[j].Yi+length(lista[j].palabra)-1;
 end;

procedure povert;
 begin
  lista[j].encontrada:=true;
  lista[j].Xf:=posX;
  lista[j].Yf:=i;
  lista[j].Xi:=lista[j].Xf+length(lista[j].palabra)-1;
  lista[j].Yi:=lista[j].Yf;
 end;

procedure podia1;
 begin
   lista[j].encontrada:=true;
   lista[j].Xf:=posX;
   lista[j].Yf:=posX+i;
   lista[j].Xi:=lista[j].Xf+length(lista[j].palabra)-1;
   lista[j].Yi:=lista[j].Yf+length(lista[j].palabra)-1;
 end;

procedure podia4;
 begin
  lista[j].encontrada:=true;
  lista[j].Xf:=x-posX+1;
  lista[j].Yf:=posX+i;
  lista[j].Xi:=lista[j].Xf-length(lista[j].palabra)+1;
  lista[j].Yi:=lista[j].Yf+length(lista[j].palabra)-1;
 end;

(**************FIN DE LOS PROCEDIMIENTOS PARA HALLAR COORDENADAS***********)

procedure comparar;
{va comparando cada palabra y su palindromo en las horizontales, verticales
y diagonales, hallando sus coordenadas cuando se encuntran}
begin
 for i:= 1 to x do
  begin
   for j:= 1 to n do
    with lista[j] do
     begin
      if not(encontrada) then
       begin
        posY:= pos(palabra,hori[i]);
        if posY<>0 then pahori;
        posY:= pos(palabra,diag2[i]);
        if posY<>0 then padia2;
        posY:= pos(palabra,diag3[i]);
        if posY<>0 then padia3;
        posY:= pos(palindromo,hori[i]);
        if posY<>0 then pohori;
        posY:= pos(palindromo,diag2[i]);
        if posY<>0 then podia2;
        posY:= pos(palindromo,diag3[i]);
        if posY<>0 then podia3;
       end;{if not(encontrada)}
     end;{with}
  end;{for i}
 for i:= 1 to y do
  begin
   for j:= 1 to n do
    begin
     with lista[j] do
      begin
       if not(encontrada) then
        begin
         posX:= pos(palabra, vert[i]);
         if posX<>0 then pavert;
         posX:= pos(palabra, diag1[i]);
         if posX<>0 then padia1;
         posX:= pos(palabra, diag4[i]);
         if posX<>0 then padia4;
         posX:= pos(palindromo, vert[i]);
         if posX<>0 then povert;
         posX:= pos(palindromo, diag1[i]);
         if posX<>0 then podia1;
         posX:= pos(palindromo, diag4[i]);
         if posX<>0 then podia4;
        end;{if not(encontrada}
      end;{with lista[j]}
    end;{for j}
  end;{for i}
end;

procedure escribir_datos;
var
 i: byte;
begin
 assign(f, 'SOP.RES');
 rewrite(f);
 for i:=1 to n do
  if lista[i].encontrada then
   with lista[i] do
   begin
    write(f, Xi,' ',Yi,' ');
    writeln(f, Xf,' ',Yf);
   end
   else
   writeln(f, '???');
 close(f);
end;

begin
 leer_datos;
 if (x<>0) and (y<>0) and (n<>0) then
  begin
   vert_diag;
   comparar;
   escribir_datos;
  end
 else
  begin{si no hay palabras o sopa de letras,no se escribe nada}
  assign(f, 'SOP.RES');
  rewrite(f);
  close(f);
  end;
end.


© (2001-2008) ALGORITMIA.NET - Política de privacidad