Guest User

Untitled

a guest
Aug 11th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.03 KB | None | 0 0
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   {$IFDEF UNIX}{$IFDEF UseCThreads}
  7.   cthreads,
  8.   {$ENDIF}{$ENDIF}
  9.   Classes
  10.   { you can add units after this };
  11.  
  12. {$R *.res}
  13.  
  14. const
  15.   n = 6;
  16.   maxn = 10000;
  17.  
  18. type node = record
  19.             s:string;
  20.             parent:integer;
  21.             dep:integer;
  22.             method:integer;
  23.             end;
  24.      bin = 0..1;
  25. var
  26.   src,dst:string;
  27.   a,b:array[1..n] of string;
  28.   c:integer;
  29.   i:integer;
  30.   status:array[0..1, 1..maxn] of node;
  31.   front:array[0..1] of integer;
  32.   rear:array[0..1] of integer;
  33.   found:boolean;
  34.  
  35.  
  36. procedure init;
  37. begin
  38.   readln(src);
  39.   readln(dst);
  40.   c := 0;
  41.  
  42.   while not eof do
  43.     begin
  44.       while not eoln do
  45.         begin
  46.           inc(c);
  47.           readln(a[c]);
  48.           readln(b[c]);
  49.         end;
  50.       readln;
  51.     end;
  52.  
  53.   status[0,1].s := src;
  54.   status[0,1].dep := 0;
  55.   status[0,1].parent := 0;
  56.   status[0,1].method := 0;
  57.   status[1,1].s := dst;
  58.   status[1,1].dep := 0;
  59.   status[1,1].parent := 0;
  60.   status[1,1].method := 0;
  61.   front[0] := 1;rear[0]:= 2;
  62.   front[1] := 1; rear[1]:= 2;
  63.   found:=false;
  64.  
  65. end;
  66.  
  67. function check(st:bin):boolean;
  68. var
  69.   i:integer;
  70. begin
  71.   for i := 1 to rear[st] - 1 do
  72.     begin
  73.       if status[st, i].s = status[st, rear[st]].s then
  74.         begin
  75.           check:=false;
  76.           exit;
  77.         end;
  78.     end;
  79.   check:=true;
  80. end;
  81.  
  82. procedure print(st:bin;tail,k:integer);
  83. procedure print0(m:integer);
  84. begin
  85.   if m = 1 then exit;
  86.  
  87.   print0(status[0,m].parent);
  88.   write(status[0,m].method);
  89. end;
  90. procedure print1(m:integer);
  91. begin
  92.  
  93.   while m <> 1 do
  94.   begin
  95.     write(status[1,m].method);
  96.     m:=status[1,m].parent;
  97.   end;
  98. end;
  99.  
  100. begin
  101.   if st = 0 then
  102.     begin
  103.       writeln('steps:',status[0,tail].dep + status[1,k].dep);
  104.  
  105.       print0(tail);
  106.  
  107.       print1(k);
  108.     end
  109.   else
  110.     begin
  111.       writeln('steps:',status[1,tail].dep + status[0,k].dep);
  112.  
  113.       print0(k);
  114.  
  115.       print1(tail);
  116.     end;
  117. end;
  118.  
  119.  
  120. procedure find(st:bin);
  121. var
  122.   i:integer;
  123. begin
  124.   for i := 1 to rear[1-st]-1 do
  125.     begin
  126.       if status[st, rear[st]].s = status[1-st,i].s then
  127.         begin
  128.           print(st, rear[st],i);
  129.           found:=true;
  130.  
  131.         end;
  132.     end;
  133. end;
  134.  
  135. procedure expand(st:bin);
  136. var
  137.   tmpstatus,newstatus:node;
  138.   i:integer;
  139.   p:integer;
  140.   len:integer;
  141.  
  142. begin
  143.   tmpstatus := status[st, front[st]];
  144.  
  145.   for i := 1 to c do
  146.     begin
  147.       if st = 0  then
  148.         begin
  149.          p := pos(a[i], tmpstatus.s);
  150.          len := length(a[i]);
  151.         end
  152.       else
  153.         begin
  154.           p := pos(b[i], tmpstatus.s) ;
  155.           len := length(b[i]);
  156.         end;
  157.  
  158.       if p <> 0 then
  159.         begin
  160.           newstatus := tmpstatus;
  161.           delete(newstatus.s, p, len);
  162.  
  163.           if st = 0 then
  164.             insert(b[i], newstatus.s, p)
  165.           else
  166.             insert(a[i], newstatus.s, p);
  167.  
  168.           inc(newstatus.dep);
  169.           newstatus.method:=i;
  170.           newstatus.parent:=front[st];
  171.  
  172.           status[st,rear[st]]:=newstatus;
  173.           if check(st) then
  174.             begin
  175.               find(st);
  176.               inc(rear[st]);
  177.  
  178.             end;
  179.  
  180.         end;
  181.     end;
  182.   inc(front[st]);
  183. end;
  184.  
  185. begin
  186.   assign(input, 'D:\UVa\uva_in.txt');
  187.   reset(input);
  188.  
  189.   assign(output, 'D:\UVa\uva_out.txt');
  190.   rewrite(output);
  191.  
  192.  
  193.   init;
  194.   {
  195.   writeln(src, ' ', dst);
  196.   writeln('c=',c);
  197.   for i := 1 to c do
  198.     writeln(a[i], ' ', b[i]);
  199.   }
  200.  
  201.   find(1);
  202.  
  203.   repeat
  204.     if (rear[0] <= rear[1]) and not ((front[0] >= rear[0]) or (rear[0] > maxn)) then expand(0);
  205.     if (rear[1] <= rear[0]) and not ((front[1] >= rear[1]) or (rear[1] > maxn)) then expand(1);
  206.     if not ((front[0] >= rear[0]) or (rear[0] > maxn)) then expand(0);
  207.     if not ((front[1] >= rear[1]) or (rear[1] > maxn)) then expand(1);
  208.   until (found = true) or (status[0,front[0]].dep + status[1,front[1]].dep > 10) or (((front[0] >= rear[0]) or (rear[0] > maxn)) and ((front[1] >= rear[1]) or (rear[1] > maxn)));
  209.  
  210.   if not found then
  211.     writeln('No solution');
  212.   readln;
  213. end.
Add Comment
Please, Sign In to add comment