{*****************************************************************}

{*                   Algoritmos de búsqueda                      *}

{* Para que se entienda mejor , se ha concretado un problema que *}

{* consiste en buscar el camino que debe seguir un caballo en un *}

{* tablero de ajedrez para llegar desde una posición inicial a   *}

{* una posición final . La estructura de tablero es un registro  *}

{* con tres campos : la fila , la columna y la profundidad en el *}

{* árbol de búsqueda del nodo . El primer nodo tiene profundidad *}

{* de 1 por convención                                           *}

{*****************************************************************}

 

program Busqueda;

 

interface

 

uses Listas;

 

var PosicionInicial,PosicionFinal:TipoValor;

    Abierta,Cerrada,Expandidos:TipoPuntero;

 

implementation

{$R *.DFM}

 

{Comprueba que una posición generada es válida}

function PosicionValida(p:TipoValor):Boolean;

begin

  if (p.Fila>0) and (p.Fila<9) and (p.Columna>0) and (p.Columna<9) then Result:=True

  else Result:=False

end;

 

{Genera los movimientos posibles a partir de una cierta posición}

procedure GeneraMovimientos(var ListaMovimientos:TipoPuntero;Posicion:TipoValor);

var f,c:Integer;

  procedure Generar;

  var p:Tipovalor;

  begin

  p.Fila:=Posicion.Fila+f;

  p.Columna:=Posicion.Columna+c;

  p.Profundidad:=Posicion.Profundidad+1;

  if PosicionValida(p) then InsertarCola(ListaMovimientos,p)

  end;

begin

  IniciarCola(ListaMovimientos);

  f:=-1;c:=-2;Generar;

  f:=-1;c:=2;Generar;

  f:=1;c:=-2;Generar;

  f:=1;c:=2;Generar;

  f:=-2;c:=-1;Generar;

  f:=-2;c:=1;Generar;

  f:=2;c:=-1;Generar;

  f:=2;c:=1;Generar

end;

 

{Comprueba si una posición dada es la solución}

function Solucion(PosiIni,PosiFinal:TipoValor):Boolean;

begin

  If CompararRegistrosPosicion(PosiIni,PosiFinal) then Result:=True

  else Result:=false

end;

 

function Busqueda_En_Anchura(PoicionInicial,PosicionFinal:TipoValor):Boolean;

var m,n:TipoValor;

begin

  IniciarCola(Abierta);

  IniciarCola(Cerrada);

  InsertarCola(Abierta,PosicionInicial);

  n.Fila:=0;

  n.Columna:=0;

  n.Profundidad:=0;

  While (ColaVacia(Abierta)=false) and

        (Solucion(PosicionFinal,n)=false) do

  begin

    m:=SacarCola(Abierta);

    InsertarCola(Cerrada,m);

    GeneraMovimientos(Expandidos,m);

    While ColaVacia(Expandidos)=False do

    begin

      n:=SacarCola(Expandidos);

      if Solucion(PosicionFinal,n)=true then

      begin InsertarCola(Cerrada,n);Break end

      else InsertarCola(Abierta,n)

    end

  end;

  if Solucion(PosicionFinal,n) then Result:=True else Result:=False

end;

 

function Busqueda_En_Profundidad(PosicionInicial,PosicionFinal:TipoValor;

         lp:Integer):Boolean;

var m,n:TipoValor;

begin

  IniciarPila(Abierta);

  IniciarCola(Cerrada);

  InsertarPila(Abierta,PosicionInicial);

  n.Fila:=0;

  n.Columna:=0;

  n.Profundidad:=0;

  While (PilaVacia(Abierta)=false) and

      (Solucion(PosicionFinal,n)=false) do

  begin

    m:=SacarPila(Abierta);

    if m.Profundidad<=lp then begin

      InsertarCola(Cerrada,m);

      GeneraMovimientos(Expandidos,m);

      While ColaVacia(Expandidos)=False do begin

        n:=SacarCola(Expandidos);

        if Solucion(PosicionFinal,n)=true then

        begin InsertarCola(Cerrada,n);Break end

        else InsertarPila(Abierta,n)

      end

    end

  end;

  if Solucion(PosicionFinal,n) then Result:=True else Result:=False

end;

 

begin

 

  {Aquí se introduce la posición inicial y final cargando los registros

  teniendo en cuenta que la profundidad inicial es 1 y la final cualquiera

  ya que la desconocemos . Para el caso de la búqeuda en profundidad , hay

  que introducir la variable lp que señala la profundidad máxima a buscar .

  Luego se llama al algoritmo deseado de búsqueda y nos devuelve true si ha

  encontrado la solución y false si no la ha encontrado . El camino

  recorrido lo obtenemos de la cola "Cerrada" . Podemos leerla con esta

  secuencia (debemos definir la manera de ver los nodos . Por ejemplo ,

  creamos un procedimiento para imprimir nodos en impresora "ImprimirNodo(n)"

  While ColaVacia(Cerrada)=false do begin

    n:=SacarCola(Cerrada);

    ImprimirNodo(n)

  end;

  Ademas , aquí se introducen todas las sentencias del programa en sí}

 

end.

1