Скачиваний:
5
Добавлен:
01.05.2014
Размер:
3 Кб
Скачать
 {Џа®Ја ¬¬  ­Ґ гзЁвлў ой п бЁ¬¬ҐваЁо аҐиҐ­Ё©.}
program queen_;
Uses Dos;

const maxN = 20;
type Nat  = 1..maxN;
var n : Nat;
    fout : Text;
    t, t1,t2 : LongInt;
    min, sec, s100 : Word;

procedure Queen( n : Nat );

type Nat0 = 0..maxN;
     Nat1 = 1..maxN+1;
     pos = array [Nat] of Nat1;
 var k : Nat0;
     i : Nat;
     a, s : pos;        { s[k] - ­ Ё¬Ґ­миЁ© н«Ґ¬Ґ­в ¬­®¦Ґбвў  Sk   }
                        { ­Ґ®Їа®Ў®ў ­­ле (¤®ЇгбвЁ¬ле) §­ зҐ­Ё©     }
     count : Longint;   { бзҐвзЁЄ ®Ўб«Ґ¤®ў ­­ле г§«®ў ¤ҐаҐў  Ї®ЁбЄ }
     countS : Longint;  { бзҐвзЁЄ ­ ©¤Ґ­ле аҐиҐ­Ё©                 }
    
  function NoQueen : Boolean;
  { NoFerz = 'дҐа§м ­Ґ ¬®¦Ґв Ўлвм Ї®бв ў«Ґ­ ў бва®Єг s[k] бв®«Ўж  k' }
    var Flag : Boolean;
        i    : Nat;
  begin {NoFerz}
    Flag := True;
    i := 1;
    while (i<k) and Flag do
    begin { Flag='дҐа§Ё [1..i) ­Ґ  в Єгов Ї®«Ґ <k,s[k]>'}
          {  в ЄгҐв «Ё дҐа§м Ё§ i-Ј® бв®«Ўж  Ї®«Ґ <k,s[k]>?}
      Flag := not ( (a[i]=s[k]) or (abs(a[i]-s[k])=k-i) );
      i := i+1
    end {while};
   NoQueen := not Flag
  end {NoQueen};

  procedure RestSk;
  { ­ ©вЁ б«Ґ¤го饥 ­ Ё¬Ґ­м襥 §­ зҐ­ЁҐ s[k],
    ­ зЁ­ п б ⥪г饣® s[k]; Ґб«Ё в Є®ў®Ј® ­Ґв, в® s[k]=n+1 }
  begin
    while (s[k]<=n) and NoQueen do s[k] := s[k] + 1
  end {RestSk};

 begin{queen}
  a[1] := 1; s[1] := 1;
  k := 1;
  count :=0;  countS := 0;  

  while k>0 do
  begin
    while (k>=1) and (s[k]<=n) do
    begin
     a[k] := s[k];
     s[k] := s[k] + 1;
     RestSk;
     count := count + 1;
     if k=n then
       begin { аҐиҐ­ЁҐ ­ ©¤Ґ­® }
         countS := countS + 1;   Write(fout,countS:7,' :: ');
         for i:=1 to n do Write(fout, a[i]:3);  WriteLn(fout)
       end { дЁЄб жЁЁ аҐиҐ­Ёп }
     else
       begin { ЇҐаҐе®¤ Є б«Ґ¤го饩 ўҐавЁЄ «Ё }
         k := k + 1;
         s[k] := 1;
         RestSk
       end {if}
    end {while};
    k := k-1 {backtrack}
  end {while};
  WriteLn(fout,'ўбҐЈ® ўҐаиЁ­ = ',count)
end {Queen};

    procedure MyGetTime ( var t : LongInt );
   {ўл¤ Ґв ўаҐ¬п ў б®вле ¤®«пе ᥪ㭤л}
     var h, m, s , hund : Word;
   begin
     GetTime( h, m , s, hund);
     t := s + 60 * m;
     t := hund + 100 * t
   end { MyGetTime };

   procedure MyUnPackTime ( t: LongInt; var m, s, hund : Word );
   {ЇҐаҐў®¤Ёв ўаҐ¬п t (ў б®вле ¤®«пе ᥪ㭤л)
    ў ¬Ё­гвл m, ᥪ㭤л s, б®влҐ hund       }
    begin
     hund := t mod 100;
     t := t div 100; {ў ᥪ㭠е}
     s := t mod 60;
     m := t div 60
    end { MyUnPackTime };

begin
  WriteLn(' n=?');  ReadLn(n);
  Assign(fout,'QOUT.DAT');
  Rewrite{Append}(fout);
  WriteLn(fout,'Є®«ЁзҐбвў® дҐа§Ґ© = ',n:2);
  WriteLn(fout,'а Ґ и Ґ ­ Ё п :');
  MyGetTime(t1);

  Queen ( n );

  MyGetTime(t2);
  t := t2 - t1; MyUnPackTime( t, min, sec, s100);
  if(s100<10)
   then WriteLn(fout,'ўаҐ¬п = ', min,' ¬Ё­ ', sec,'.0', s100,' ᥪ')
   else WriteLn(fout,'ўаҐ¬п = ', min,' ¬Ё­ ', sec,'.', s100,' ᥪ');
  Close (fout)
end.
Соседние файлы в папке QUEEN1