Взываю к вашей помощи Боги кодирования и новички!
В общем и целом сложных вопросов у меня нет, застопорился на мелочах в программе основой которой служит алгоритм величайшего кодера Дейкстры.
Вот код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f: textfile;
temp, i, j: integer;
tempstr: string;
begin
assignfile(f, 'Valuesmatrix.txt');
reset(f);
readln(f, temp);
GrafVal.colcount := temp;
readln(f, temp);
GrafVal.rowcount := temp;
for i := 0 to GrafVal.colcount -1 do
for j := 0 to GrafVal.rowcount -1 do
begin
readln(F, tempstr);
GrafVal.cells[i, j] := tempstr;
end;
closefile(f);
end;
Это код загрузки многомерного массива из файла в объект StringGrid , который по непонятным для меня причинам вешает программу.
Код:
procedure InitialConditions; //Начальные условия
var f: text;
i, j: integer;
begin
Assign(f, 'Valuesmatrix.txt');
Reset(f);
for i:=1 to n do
begin
for j:=1 to n do
Read(f, GrafVal[i,j])
end;
//Ввод завешён
start:=strtoint(Form2.Edit1.text);
For i:=1 to n do
Begin
done[i]:=False; //Все вершины не просмотрены
Ves_verhin[i]:=GrafVal[Start, i]; //Смотри строку #start
N_pred_versh[i]:=Start
End;
N_pred_versh[Start]:=0;
done[Start]:=True
End;
Function Possible: Boolean; //Возможность
Var i: integer;
Begin
Possible:=True;
For i:=1 to n do If not done[i] then Exit; //если вершина не рассмотрена, то possible = true
Possible:=False //если вершина рассмотрена, то possible = false
End;
Function Min: Integer; //# min вершины
Var i, MinVes, CurrentMin: integer; // текущий min
Begin
MinVes:=Infinity; //бесконечность
For i:=1 to n do
If not done[i] then //если не рассмотрена, то
If Ves_verhin[i]<MinVes then
Begin
CurrentMin:=i; //текущий min = vershina #i
MinVes:=Ves_verhin[i]
End;
min:=CurrentMin
End;
procedure TForm2.Button1Click(Sender: TObject);
begin
if Form2.Edit1.text:= 'A' then start:=GrafVal(1);
if Form2.Edit1.text:= 'B' then start:=(i[2],j[2]);
if Form2.Edit1.text:= 'C' then start:=(i[3],j[3]);
if Form2.Edit1.text:= 'D' then start:=(i[4],j[4]);
if Form2.Edit1.text:= 'E' then start:=(i[5],j[5]);
if Form2.Edit1.text:= 'F' then start:=(i[6],j[6]);
if Form2.Edit1.text:= 'G' then start:=(i[7],j[7]);
if Form2.Edit1.text:= 'H' then start:=(i[8],j[8]);
if Form2.Edit1.text:= 'I' then start:=(i[9],j[9]);
if Form2.Edit1.text:= 'J' then start:=(i[10],j[10]);
if Form2.Edit1.text:= 'K' then start:=(i[11],j[11]);
end;
Begin
InitialConditions;
While Possible do //пока вершина не рассмотрена делать:
Begin
last:=min; //LAST - последняя рассмотренная вершина
done[last]:=True; //вершина last рассмотрена
For i:=1 to n do
If Ves_verhin[i]>Ves_verhin[last]+GrafVal[i, last] then
Begin
Ves_verhin[i]:=Ves_verhin[last]+GrafVal[i, last];
N_pred_versh[i]:=last
End
End;
Finish:=strtoint(Edit2.text);
Label3.Caption:=inttostr(Finish);
Finish:=N_pred_versh[Finish];
Label7.Caption:=IntToStr(Ves_verhin[Finish]);
While Finish<>0 do
Begin
Label3.Caption:=Label3.Caption+'<-'+ inttostr(Finish);
Finish:=N_pred_versh[Finish];
End;
End;
Это код того самого алгоритма, для тех кто уже заметил полнейший бред: if ... then ... повторяющийся 11 раз и громко смеётся поясняю - это мои безрезультатные попытки получить нужное мне значение как раз из той матрицы, которая не загружается.
Все файлы программы прикреплены.
Если кто то знает как это реализовать или же у кого то в голове есть свежие интересные идеи на этот счёт, прошу Вас подскажите.
Благодарю за внимание.