Advertisement
AlukardBF

123

Dec 12th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.44 KB | None | 0 0
  1. type
  2.   matrix = array of array of integer;
  3.  
  4. procedure CreateMatrix(var pMatrix: matrix; count_row, count_col: integer);
  5. var
  6.   i, j: integer;
  7. begin
  8.   SetLength(pMatrix, count_row, count_col);
  9.   For i:=0 To count_row-1 Do
  10.       For j:=0 To count_col-1 Do
  11.           pMatrix[i, j] := 0;
  12. end;
  13.  
  14. procedure FillMatrix(var pMatrix: matrix; count_row, count_col: integer);
  15. var
  16.   i, j: integer;
  17. begin
  18.   Writeln(UTF8Decode('Заполнение количества запасов поставщиков: '));
  19.   For i:=1 To count_row Do
  20.     Begin
  21.       Write(UTF8Decode('Количество запасов '), i, UTF8Decode('-ого поставщика = '));
  22.       Readln(pMatrix[i, 0]);
  23.     End;
  24.   Writeln();
  25.   For i:=1 To count_col Do
  26.     Begin
  27.       Write(UTF8Decode('Количество потребностей '), i, UTF8Decode('-ого потребителя = '));
  28.       Readln(pMatrix[0, i]);
  29.     End;
  30.   Writeln();
  31.   For i:=1 To count_row Do
  32.     For j:=1 To count_col Do
  33.       Begin
  34.         Write(UTF8Decode('Введите стоимость перевозки между ') , i, UTF8Decode('-ым поставщиком и '), j, UTF8Decode('-ым потребителем = '));
  35.         Readln(pMatrix[i, j]);
  36.       End;
  37.   Writeln();
  38. end;
  39.  
  40. procedure ShowMatrix(pMatrix: matrix; count_row, count_col: integer);
  41. var
  42.   i, j: integer;
  43. begin
  44.   For i:=0 To count_row-1 Do
  45.   Begin
  46.     For j:=0 To count_col-1 Do
  47.       Begin
  48.         Write(pMatrix[i, j]:3);
  49.       End;
  50.     Writeln();
  51.   End;
  52. end;
  53.  
  54. function FillBasicPlan(var pMatrix, pMatrix2: matrix; count_row, count_col: integer) : integer;
  55. var
  56.   i, j, basic_plan, f_min, s_min, cord_max_i, cord_max_j, max, cord_min_i, cord_min_j, min: integer;
  57.   isReady, isZero: boolean;
  58. begin
  59.   basic_plan := 0;
  60.   isReady := false;
  61.  
  62.   While isReady = false Do
  63.   begin
  64.     For i := 1 To count_row-1 Do
  65.     begin
  66.       isZero := false;
  67.       f_min := 0;
  68.       s_min := 0;
  69.       if pMatrix[i, 0] = 0 then
  70.         isZero := true;
  71.       if isZero = false then
  72.       begin
  73.         For j := 1 To count_col-1 Do
  74.         begin
  75.           if pMatrix[0, j] <> 0 then
  76.           begin
  77.             if f_min = 0 then
  78.               f_min := pMatrix[i, j]
  79.             else
  80.               if s_min = 0 then
  81.                 s_min := pMatrix[i, j];
  82.           end;
  83.         end;
  84.         if f_min > s_min then
  85.         begin
  86.           f_min := f_min + s_min;
  87.           s_min := f_min - s_min;
  88.           f_min := f_min - s_min;
  89.         end;
  90.         For j := 3 To count_col-1 Do
  91.         begin
  92.           if pMatrix[0, j] <> 0 then
  93.           begin
  94.             if (pMatrix[i, j] > f_min) and (pMatrix[i, j] < s_min) then
  95.               s_min := pMatrix[i, j]
  96.             else
  97.             begin
  98.               if pMatrix[i][j] <= f_min then
  99.               begin
  100.                 s_min := f_min;
  101.                               f_min := pMatrix[i, j];
  102.               end;
  103.             end;
  104.           end;
  105.         end;
  106.         pMatrix[i, j + 1] := abs(s_min - f_min);
  107.       end;
  108.     end;
  109.     //
  110.     For j := 1 To count_col-1 Do
  111.     begin
  112.       isZero := false;
  113.       f_min := 0;
  114.       s_min := 0;
  115.       if pMatrix[0, j] = 0 then
  116.         isZero := true;
  117.       if isZero = false then
  118.       begin
  119.        
  120.         For i := 1 To count_row-1 Do
  121.         begin
  122.           if pMatrix[i, 0] <> 0 then
  123.           begin
  124.             if f_min = 0 then
  125.             begin
  126.               f_min := pMatrix[i, j];
  127.             end
  128.             else
  129.               if s_min = 0 then
  130.               begin
  131.                 s_min := pMatrix[i, j];
  132.               end;
  133.           end;
  134.         end;
  135.         if f_min > s_min then
  136.         begin
  137.           f_min := f_min + s_min;
  138.           s_min := f_min - s_min;
  139.           f_min := f_min - s_min;
  140.         end;
  141.        
  142.         For i := 3 To count_row-1 Do
  143.         begin
  144.           if pMatrix[i, 0] <> 0 then
  145.           begin
  146.             if (pMatrix[i, j] > f_min) and (pMatrix[i, j] < s_min) then
  147.               s_min := pMatrix[i, j]
  148.             else
  149.             begin
  150.               if pMatrix[i][j] <= f_min then
  151.               begin
  152.                 s_min := f_min;
  153.                               f_min := pMatrix[i, j];
  154.               end;
  155.             end;
  156.           end;
  157.         end;
  158.         pMatrix[i + 1, j] := abs(s_min - f_min);
  159.       end;
  160.     end;
  161.  
  162.     cord_max_i := count_row;
  163.     cord_max_j := count_col;
  164.     max := 0;
  165.     For j := 1 To count_col-1 Do
  166.     begin
  167.       if pMatrix[0, j] <> 0 then
  168.       begin
  169.         if pMatrix[count_row, j] > max then
  170.         begin
  171.           max := pMatrix[count_row, j];
  172.                     cord_max_i := count_row;
  173.                     cord_max_j := j;
  174.         end;
  175.       end;
  176.     end;
  177.     For i := 1 To count_row-1 Do
  178.     begin
  179.       if pMatrix[i, 0] <> 0 then
  180.       begin
  181.         if pMatrix[i, count_col] > max then
  182.         begin
  183.           max := pMatrix[i, count_col];
  184.                     cord_max_i := i;
  185.                     cord_max_j := count_col;
  186.         end;
  187.       end;
  188.     end;
  189.     Write(UTF8Decode('Максимум = '), max, ' [', i, ', ', j, ']');
  190.    
  191.     cord_min_i := 0;
  192.     cord_min_j := 0;
  193.     min := MAXINT;
  194.    
  195.     if cord_max_i = count_row then
  196.     begin
  197.       Writeln(UTF8Decode(' Максимум в строке'));
  198.       For i := 1 To count_row-1 Do
  199.       begin
  200.         if pMatrix[i, 0] <> 0 then
  201.         begin
  202.           if pMatrix[i, cord_max_j] < min then
  203.           begin
  204.             min := pMatrix[i, cord_max_j];
  205.                         cord_min_i := i;
  206.                         cord_min_j := cord_max_j;
  207.           end;
  208.         end;
  209.       end;
  210.     end
  211.     else
  212.     begin
  213.       if cord_max_j = count_col then
  214.       begin
  215.         Writeln(UTF8Decode(' Максимум в столбце'));
  216.         For j := 1 To count_col-1 Do
  217.         begin
  218.           if pMatrix[0, j] <> 0 then
  219.           begin
  220.             if pMatrix[cord_max_i, j] < min then
  221.             begin
  222.               min := pMatrix[cord_max_i, j];
  223.               cord_min_i := cord_max_i;
  224.               cord_min_j := j;
  225.             end;
  226.           end;
  227.         end;
  228.       end;
  229.     end;
  230.    
  231.     Writeln(UTF8Decode('Минимум в матрице = '), min);
  232.     Writeln(UTF8Decode('Координаты минимума: ['), cord_min_i, ', ', cord_min_j, ']');
  233.     if pMatrix[0, cord_min_j] <= pMatrix[cord_min_i, 0] then
  234.     begin
  235.       pMatrix2[cord_min_i, cord_min_j] := pMatrix[cord_min_i, cord_min_j] * pMatrix[0, cord_min_j];
  236.             pMatrix[cord_min_i, 0] := pMatrix[cord_min_i, 0] - pMatrix[0, cord_min_j];
  237.             pMatrix[0][cord_min_j] := 0
  238.     end
  239.     else
  240.     begin
  241.       if pMatrix[0, cord_min_j] > pMatrix[cord_min_i, 0] then
  242.       begin
  243.         pMatrix2[cord_min_i, cord_min_j] := pMatrix[cord_min_i, cord_min_j] * pMatrix[cord_min_i, 0];
  244.         pMatrix[0, cord_min_j] := pMatrix[0, cord_min_j] - pMatrix[cord_min_i, 0];
  245.         pMatrix[cord_min_i, 0] := 0;
  246.       end;
  247.     end;
  248.    
  249.     basic_plan := basic_plan + pMatrix2[cord_min_i, cord_min_j];
  250.     Readln();
  251.     isReady := true;
  252.     For j := 1 To count_col-1 Do
  253.       if pMatrix[0, j] <> 0 then
  254.         isReady := false;
  255.     For i := 1 To count_row-1 Do
  256.       if pMatrix[i, 0] <> 0 then
  257.         isReady := false;
  258.   end;
  259.   FillBasicPlan := basic_plan;
  260. end;
  261.  
  262. Var
  263.   count_supplier, count_consumer: integer;
  264.   max_row, max_col: integer;
  265.   sum_basic_plan: integer;
  266.   DeliveryMatrix, BasicPlan: matrix;
  267. Begin
  268.   Writeln(UTF8Decode('Введите количество поставщиков: '));
  269.   Read(count_supplier);
  270.   Writeln(UTF8Decode('Введите количество потребителей: '));
  271.   Read(count_consumer);
  272.   Writeln();
  273.   max_row := count_supplier + 3;
  274.   max_col := count_consumer + 3;
  275.   CreateMatrix(DeliveryMatrix, max_row, max_col);
  276.   //Заполняем матрицу поставок
  277.   FillMatrix(DeliveryMatrix, count_supplier, count_consumer);
  278.   //Вывод матрицы поставок
  279.   Writeln(UTF8Decode('Матрица поставок сформирована'));
  280.   ShowMatrix(DeliveryMatrix, max_row, max_col);
  281.   Writeln();  
  282.   //Создание опорного плана
  283.   CreateMatrix(BasicPlan, count_supplier + 1, count_consumer + 1);
  284.   sum_basic_plan := FillBasicPlan(DeliveryMatrix, BasicPlan, count_supplier + 1, count_consumer + 1);
  285.   //Вывод опорного плана
  286.   ShowMatrix(DeliveryMatrix, max_row, max_col);
  287.   Writeln(UTF8Decode('Опорный план построен'));
  288.   ShowMatrix(BasicPlan, count_supplier + 1, count_consumer + 1);
  289.   Writeln(UTF8Decode('Опорный план = '), sum_basic_plan);
  290.   Readln();
  291. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement