Advertisement
r4lovets

Говнокод позорный

Dec 4th, 2018
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.56 KB | None | 0 0
  1. program lab6;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. const
  9.   N = 5;
  10.  
  11. type
  12.   TArray = array[1..N, 1..N] of Integer;
  13.   TSet = set of 1..N;
  14.  
  15. const
  16.   TestArr: TArray = ((0, 1, 0, 1, 0), (1, 0, 1, 0, 1), (0, 1, 0, 1, 0), (1, 0, 1, 0, 1), (0, 1, 0, 1, 0));
  17.  
  18. procedure InputFromKeyboard(var A: TArray);
  19.  
  20. var
  21.   i, j, x: Integer;
  22.  
  23. begin
  24.   x := 2;
  25.   for i := 1 to N - 1 do
  26.     begin
  27.       for j := x to N do
  28.         begin
  29.           Write('A[', i, '][', j, '] = ');
  30.           Readln(A[i,j]);
  31.           A[j, i] := A[i][j];
  32.         end;
  33.       Inc(x);
  34.     end;
  35.  
  36.   for i := 1 to N do
  37.     A[i][i] := 0;
  38.  
  39.   Writeln;
  40. end;
  41.  
  42. procedure RandomInput(var A: TArray);
  43.  
  44. var
  45.   i, j, k: Integer;
  46.  
  47. begin
  48.   k := 2;
  49.   for i := 1 to N - 1 do
  50.     begin
  51.       for j := k to N do
  52.         begin
  53.           Randomize;
  54.           A[i,j] := Random(2);
  55.           Writeln('A[', i, '][', j, '] = ', A[i,j]);
  56.           A[j, i] := A[i][j];
  57.         end;
  58.       Inc(k);
  59.     end;
  60.  
  61.   for i := 1 to N do
  62.     A[i][i] := 0;
  63.  
  64.   Writeln;
  65. end;
  66.  
  67.   procedure Output(A: TArray);
  68.  
  69.   var
  70.     i, j: Integer;
  71.  
  72.   begin
  73.     for i := 1 to N do
  74.       begin
  75.         for j := 1 to N do
  76.           Write(A[i][j], ' ');
  77.         Writeln;
  78.       end;
  79.     Writeln;
  80.   end;
  81.  
  82.   procedure SelectingEnthryMethod(var A: TArray);
  83.  
  84.   var
  85.     EnthryMethod: Integer;
  86.  
  87.   begin
  88.     Writeln('Please select array entry method:'); Writeln;
  89.     Writeln('Enter ''1'' if you prefer random input.');
  90.     Writeln('Enter ''2'' if you prefer input from keyboard.');
  91.     Writeln('Enter ''3'' if you prefer input from constant.'); Writeln;
  92.     Readln(EnthryMethod); Writeln;
  93.  
  94.     case EnthryMethod of
  95.       1: RandomInput(A);
  96.       2: InputFromKeyboard(A);
  97.       3: begin A := TestArr; Writeln; end;
  98.     end;
  99.   end;
  100.  
  101. function isNotConnected(FuncNotCandidates: TSet; FuncCandidates: TSet; FuncA: TArray): Boolean;
  102.  
  103. var
  104.   i, j: Integer;
  105.   AnyNull, funcValue: Boolean;
  106.  
  107. begin
  108.   i := 1;
  109.   AnyNull := false;
  110.   funcValue := true;
  111.   while (i <= N) and (funcValue) do
  112.     begin
  113.       if (i in FuncNotCandidates) then
  114.         begin
  115.           j := 1;
  116.           while (j <= N) and (not AnyNull) do
  117.             begin
  118.               if (j in FuncCandidates) and (FuncA[i, j] = 0) then
  119.                 AnyNull := true;
  120.               Inc(j);
  121.             end;
  122.           if AnyNull = false then
  123.             funcValue := false
  124.         end;
  125.       Inc(i);
  126.     end;
  127.   isNotConnected := funcValue;
  128. end;
  129.  
  130. // вроде всё гуд до сюда
  131.  
  132. procedure extend(var Candidates: TSet; var NotCandidates: TSet; var CompSub: TSet; A: TArray);
  133.  
  134. var
  135.   Final, NotBreak: Boolean;
  136.   t, v, e, w: Integer;
  137.   new_candidates, new_NotCandidates: TSet;
  138.  
  139. begin
  140.   Final := True;
  141.   while (Candidates <> []) and (Final) and (IsNotConnected(NotCandidates, Candidates, A)) do
  142.     begin
  143.       // Выбираем вершину V из Candidates и добавляем в CompSub
  144.       t := 1;
  145.       NotBreak := true;
  146.       while (t <= N) and (NotBreak) do
  147.         begin
  148.           if (t in Candidates) then
  149.             begin
  150.               NotBreak := False;
  151.               v := t;
  152.             end;
  153.           Inc(t);
  154.         end;
  155.       compsub := compsub + [v];
  156.  
  157.       // Формируем new_candidates и new_not, удаляя из candidates и not вершины, не соединённые с v
  158.       new_candidates := Candidates;
  159.       new_NotCandidates := NotCandidates;
  160.       for e := 1 to n do
  161.         if (e in Candidates) or (e in NotCandidates) then
  162.           if A[e, v] = 0 then
  163.             begin
  164.               new_candidates := new_candidates - [e];
  165.               new_NotCandidates := new_NotCandidates - [e];
  166.             end;
  167.  
  168.       // Если Candidates и NotCandidates пусты, вызвать рекурсивно extend
  169.       if (new_Candidates = []) and (new_NotCandidates = []) then
  170.           begin
  171.             Final := False;
  172.             for w := 1 to N do
  173.               if w in CompSub then
  174.                 Write(w, ' ');
  175.  
  176.  
  177.           end
  178.       else
  179.         extend(new_Candidates, new_NotCandidates, compsub, A);
  180.       Break;
  181.  
  182.       compsub := compsub - [v];
  183.       candidates := candidates - [v];
  184.       NotCandidates := NotCandidates + [v];
  185.  
  186.     end;
  187.   Sleep(1);
  188. end;
  189.  
  190. var
  191.   Matrix: TArray;
  192.   MainCompSub, MainCandidates, MainNotCandidates: TSet;
  193.   z: Integer;
  194.  
  195. begin
  196.   SelectingEnthryMethod(Matrix);
  197.   Output(Matrix);
  198.  
  199.   MainCompSub := [];
  200.   MainNotCandidates := [];
  201.   MainCandidates := [1..N];
  202.  
  203.   extend(MainCandidates, MainNotCandidates, MainCompSub, Matrix);
  204.  
  205.   Readln;
  206. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement