unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm2 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button3: TButton; Label1: TLabel; StringGrid2: TStringGrid; StringGrid3: TStringGrid; StringGrid4: TStringGrid; StringGrid5: TStringGrid; Label2: TLabel; StringGrid6: TStringGrid; StringGrid7: TStringGrid; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure StringGrid1KeyPress(Sender: TObject; var Key: Char); procedure StringGrid2KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form2: TForm2; i,j:Integer; implementation uses Unit1, Math; {$R *.dfm} procedure TForm2.Button3Click(Sender: TObject); begin if MessageDlg('Вы действительно хотите выйти из программы!',mtWarning,[mbYes,mbNo],0) =mrYes then begin Close; Application.Terminate; end; end; procedure TForm2.Button1Click(Sender: TObject); var mas:array[0..50,0..50] of integer; mas1,mas2:array[0..50]of integer; b,s1,s2,min,p,i1,j1,k,k1,c1,c2,max:integer; begin //Проверка ввода b:=0; s1:=StringGrid1.RowCount*StringGrid1.ColCount; s2:=s1; for j:=0 to StringGrid1.RowCount-1 do for i:=0 to StringGrid1.ColCount-1 do if (StringGrid1.Cells[i,j]=EmptyStr) then s1:=s1-1; if(s1<>s2)then Begin MessageDlg('Таблица не заполнена!',mtWarning,[mbOK],0); b:=1; end; for j:=0 to StringGrid2.RowCount-1 do if (StringGrid2.Cells[0,j]=EmptyStr) then begin MessageDlg('Столбец стоимости не заполнен!',mtWarning,[mbOK],0); b:=1; break; end; for i:=0 to StringGrid3.ColCount-1 do if (StringGrid3.Cells[i,0]=EmptyStr) then begin MessageDlg('Строка стоимости не заполнена!',mtWarning,[mbOK],0); b:=1; break; end; //Начальное решение if(b=0)then begin StringGrid2.Options:=StringGrid2.Options-[goEditing,goAlwaysShowEditor]; StringGrid3.Options:=StringGrid3.Options-[goEditing,goAlwaysShowEditor]; StringGrid1.Hide; StringGrid4.Show; s1:=0; for j:=0 to StringGrid2.RowCount-1 do if (StringGrid2.Cells[0,j]<>EmptyStr) then s1:=StrToInt(StringGrid2.Cells[0,j])+s1; s2:=0; for i:=0 to StringGrid3.ColCount-1 do if (StringGrid3.Cells[i,0]<>EmptyStr) then s2:=StrToInt(StringGrid3.Cells[i,0])+s2; if (s1<>s2) then if (s1>s2) then Begin StringGrid3.ColCount:=StringGrid3.ColCount+1; StringGrid6.ColCount:=StringGrid6.ColCount+1; StringGrid3.Cells[StringGrid3.ColCount-1,0]:=IntToStr(s1-s2); StringGrid1.ColCount:=StringGrid1.ColCount+1; for i:=0 to StringGrid1.RowCount-1 do Begin StringGrid1.Cells[StringGrid1.ColCount-1,i]:=IntToStr(0); StringGrid4.ColCount:=StringGrid1.ColCount; StringGrid5.ColCount:=StringGrid1.ColCount; end end else Begin StringGrid2.RowCount:=StringGrid2.RowCount+1; StringGrid7.RowCount:=StringGrid7.RowCount+1; StringGrid2.Cells[0,StringGrid2.RowCount-1]:=IntToStr(s2-s1); StringGrid1.RowCount:=StringGrid1.RowCount+1; for j:=0 to StringGrid1.ColCount-1 do Begin StringGrid1.Cells[j,StringGrid1.RowCount-1]:=IntToStr(0); StringGrid4.RowCount:=StringGrid1.RowCount; StringGrid5.RowCount:=StringGrid1.RowCount; end; end; for i:=0 to StringGrid1.RowCount do for j:=0 to StringGrid1.ColCount do mas[i,j]:=0; for i:=0 to StringGrid2.RowCount-1 do mas2[i]:=StrToInt(StringGrid2.Cells[0,i]); for i:=0 to StringGrid3.ColCount-1 do mas1[i]:=StrToInt(StringGrid3.Cells[i,0]); p:=StringGrid1.RowCount*StringGrid1.ColCount; while(p<>0) do begin min:=99999; for j:=0 to StringGrid1.RowCount-1 do for i:=0 to StringGrid1.ColCount-1 do if ((StrToInt(StringGrid1.Cells[i,j])0)and(mas2[j1]<>0)) then begin if(mas1[i1]EmptyStr) then k1:=k1+1; while(k1<>k)do begin c1:=0; c2:=0; for j:=0 to StringGrid4.RowCount-1 do begin s1:=0; for i:=0 to StringGrid4.ColCount-1 do if(StringGrid4.Cells[i,j]=EmptyStr)then s1:=s1+1; if(s1=StringGrid4.ColCount-1) then begin c1:=c1+1; j1:=j; end; end; for i:=0 to StringGrid4.ColCount-1 do begin s2:=0; for j:=0 to StringGrid4.RowCount-1 do if(StringGrid4.Cells[i,j]=EmptyStr)then s2:=s2+1; if(s2=StringGrid4.RowCount-1) then begin c2:=c2+1; i1:=i; end; end; if(c1<=c2) then for j:=0 to StringGrid4.RowCount-1 do if(StringGrid4.Cells[i1,j]=EmptyStr) then begin StringGrid4.Cells[i1,j]:=IntToStr(0); break; end else for i:=0 to StringGrid4.ColCount-1 do if(StringGrid4.Cells[i,j1]=EmptyStr) then begin StringGrid4.Cells[i,j1]:=IntToStr(0); break; end; k1:=k1+1; end; //Метод потенциалов p:=2; while(p<>0) do begin if(p=1) then begin for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]<>inttostr(1))then if(StringGrid4.Cells[i,j]=EmptyStr)then StringGrid5.Cells[i,j]:=IntToStr(0); b:=StringGrid5.RowCount*StringGrid5.ColCount-5; while(b<>0)do Begin for j:=0 to StringGrid5.RowCount-1 do begin k1:=0; for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]<>EmptyStr)and (StringGrid5.Cells[i,j]<>inttostr(1))then k1:=k1+1 else begin i1:=i; j1:=j; end; if(k1=StringGrid5.ColCount-1) then StringGrid5.Cells[i1,j1]:=IntToStr(0); end; for i:=0 to StringGrid5.ColCount-1 do begin k1:=0; for j:=0 to StringGrid5.RowCount-1 do if(StringGrid5.Cells[i,j]<>EmptyStr)and (StringGrid5.Cells[i,j]<>inttostr(1))then k1:=k1+1 else begin i1:=i; j1:=j; end; if(k1=StringGrid5.RowCount-1) then StringGrid5.Cells[i1,j1]:=IntToStr(0); end; b:=b-1; end; b:=1; while(b<>0)do begin for j:=0 to StringGrid5.RowCount-1 do begin k1:=0; for i:=0 to StringGrid5.ColCount-1 do Begin if(StringGrid5.Cells[i,j]=EmptyStr)then begin i1:=i; j1:=j; end; if(StringGrid5.Cells[i,j]=inttostr(1)) then k1:=1; if(StringGrid5.Cells[i,j]=inttostr(-1)) then k1:=-1; end; if(k1=1) then StringGrid5.Cells[i1,j1]:=inttostr(-1); if(k1=-1) then StringGrid5.Cells[i1,j1]:=inttostr(1); end; for i:=0 to StringGrid5.ColCount-1 do begin k1:=0; for j:=0 to StringGrid5.RowCount-1 do Begin if(StringGrid5.Cells[i,j]=EmptyStr)then begin i1:=i; j1:=j; end; if(StringGrid5.Cells[i,j]=inttostr(1)) then k1:=1; if(StringGrid5.Cells[i,j]=inttostr(-1)) then k1:=-1; end; if(k1=1) then StringGrid5.Cells[i1,j1]:=inttostr(-1); if(k1=-1) then StringGrid5.Cells[i1,j1]:=inttostr(1); end; b:=0; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]=EmptyStr)then b:=1; end; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]=inttostr(-1))then begin max:=strtoint(StringGrid4.Cells[i,j]); i1:=i; j1:=j; end; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]=inttostr(-1))then if(strtoint(StringGrid4.Cells[i,j])0)do Begin for j:=0 to StringGrid4.RowCount-1 do for i:=0 to StringGrid4.ColCount-1 do if(StringGrid4.Cells[i,j]<>EmptyStr)then if((StringGrid6.Cells[i,0]<>EmptyStr)or(StringGrid7.Cells[0,j]<>EmptyStr)) then if(StringGrid6.Cells[i,0]<>EmptyStr)then StringGrid7.Cells[0,j]:=IntToStr(StrToInt(StringGrid1.Cells[i,j])-StrToInt(StringGrid6.Cells[i,0])) else if(StringGrid7.Cells[0,j]<>EmptyStr)then StringGrid6.Cells[i,0]:=IntToStr(StrToInt(StringGrid1.Cells[i,j])-StrToInt(StringGrid7.Cells[0,j])); k:=0; for j:=0 to StringGrid7.RowCount-1 do if(StringGrid7.Cells[0,j]=EmptyStr) then k:=1; for i:=0 to StringGrid6.ColCount-1 do if(StringGrid6.Cells[i,0]=EmptyStr) then k:=1; end; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid4.Cells[i,j]=EmptyStr)then StringGrid5.Cells[i,j]:=IntToStr((StrToInt(StringGrid7.Cells[0,j])+ StrToInt(StringGrid6.Cells[i,0]))-StrToInt(StringGrid1.Cells[i,j])); p:=0; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]<>EmptyStr)then if(StringGrid5.Cells[i,j]>IntToStr(0))then begin p:=1; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]<>EmptyStr)then max:=strtoint(StringGrid5.Cells[i,j]); for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do if(StringGrid5.Cells[i,j]>inttostr(max))then begin max:=strtoint(StringGrid5.Cells[i,j]); i1:=i; j1:=j; end; for j:=0 to StringGrid5.RowCount-1 do for i:=0 to StringGrid5.ColCount-1 do StringGrid5.Cells[i,j]:=EmptyStr; StringGrid5.Cells[i1,j1]:=inttostr(1); end; end; k:=0; for j:=0 to StringGrid4.RowCount-1 do for i:=0 to StringGrid4.ColCount-1 do if(StringGrid4.Cells[i,j]<>EmptyStr)then k:=k+StrToInt(StringGrid4.Cells[i,j])*StrToInt(StringGrid1.Cells[i,j]); Label2.Caption:='Суммарная стоимость перевозок = '+IntToStr(k)+'$'; end; end; procedure TForm2.StringGrid1KeyPress(Sender: TObject; var Key: Char); begin if (key<>'0') then if (key<>'1') then if (key<>'2') then if (key<>'3') then if (key<>'4') then if (key<>'5') then if (key<>'6') then if (key<>'7') then if (key<>'8') then if (key<>'9') then if (key<>chr(8)) then begin key:=#0; MessageDlg('В таблицу нужно вводить числовое значение!',mtWarning,[mbOK],0) end; end; procedure TForm2.StringGrid2KeyPress(Sender: TObject; var Key: Char); begin if (key<>'0') then if (key<>'1') then if (key<>'2') then if (key<>'3') then if (key<>'4') then if (key<>'5') then if (key<>'6') then if (key<>'7') then if (key<>'8') then if (key<>'9') then if (key<>chr(8)) then begin key:=#0; MessageDlg('В стоимость нужно вводить числовое значение!',mtWarning,[mbOK],0) end; end; end.