Проект "Пампасы" посвящен жизни друзей-слонов.  Здесь будут отражены редкие фотофакты, достоверность и правдивость комментариев к которым будут лежать на совести их создателей. Основная цель проекта - создание единого информационного пространства территориально значительно разнесённых ареалов обитания Больших, Сильных и Добрых, а также отражение в наглядной форме наиболее замечательных событий из жизни последних.





Incubus (c) 2006
  -- Created on 22.05.2010 by INCUBUS
  procedure domino_sol
  is
    type t_rec is record (dom varchar2(20), usage number, sign varchar2(20));
    type t_tbl is table of t_rec index by binary_integer;
    l_list t_tbl;
 
    type t_rec1 is record (pos number, sign varchar2(20));
    type t_tbl1 is table of t_rec1;
    l_res t_tbl1 := t_tbl1();
   
    l_succ  boolean := false;
 
    procedure init(k number, sign varchar2 := '+') is
    begin
      l_list(1).dom := '10'; l_list(1).usage := 0;   l_list(1).sign := '+';
      l_list(2).dom := '16'; l_list(2).usage := 0;   l_list(2).sign := '+';
      l_list(3).dom := '46'; l_list(3).usage := 0;   l_list(3).sign := '+';
      l_list(4).dom := '45'; l_list(4).usage := 0;   l_list(4).sign := '+';
      l_list(k).usage := 1;
      l_list(k).sign := sign;
      -----------------------
      l_res.extend;
      l_res(1).pos := k;
      l_res(1).sign := sign;
    end;

    function p(ind number, i number, sign out varchar2) return boolean is
      l_res boolean := true;
      str   varchar2(20);
    begin
      if l_list(ind).sign = '+' then
        str := substr(l_list(ind).dom, 2, 1);
      else
        str := substr(l_list(ind).dom, 1, 1);
      end if;
             
      -- ind : s chem sravnivat, i : chto sravnivat
      if str  = substr(l_list(i).dom, 1, 1) then
        sign := '+';
        l_res := true;
      elsif str = substr(l_list(i).dom, 2, 1) then
        sign := '-';
        l_res := true;
      else
        l_res := false;
      end if;
      return l_res;
    end;
   
    procedure Backtracking(ind number) is
      l_sign  varchar2(20);
    begin
      for i in 1..l_list.last loop
        if i != ind and l_list(i).usage != 1 and p(ind, i, l_sign) then
          -- update source array (mark path)
          l_list(i).usage := 1;
          l_list(i).sign := l_sign;
          -- add to res array
          l_res.extend;
          l_res(l_res.last).pos := i;
          l_res(l_res.last).sign := l_sign;
         
          if l_res.count = l_list.count then
            jb_test.d('--------------');
            for j in 1..l_res.last loop
              jb_test.d(l_res(j).pos||' '||l_res(j).sign);
            end loop;
            l_succ := true;
          end if;
                 
          Backtracking(i);
        end if;
      end loop;
      -- delete res array
      l_res.delete;
    end;
   
  begin
    -- Test statement here
    jb_test.d('Start...');
 
    init(1);

    for k in 1..l_list.count loop
      l_res.delete;
      init(k);
      Backtracking(k);
      l_res.delete;
      init(k, '-');
      Backtracking(k);
    end loop;
 
    if not l_succ then
      jb_test.d('No future !');
    else
      jb_test.d('Done.');
  
    end if;
   
  exception
    when others then
      jb_test.d('Others !!!');
      jb_test.d(sqlcode);
      jb_test.d(sqlerrm);
  end;