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. |