Program alg;
var matrixFile: textFile;
R, D: List<List<integer>>;
line: string;
i, j, n, m, index, max, Jw: integer;
positions: List<string>;
directives: List<(integer, integer)>;
Kr, Er, Ir: List<integer>;
function check(index, current: integer): boolean;
begin
if(index >= 0) and (index < positions.Count) and (positions[index] = '-') and (not Kr.Contains(index)) then begin
result := true;
end;
end;
function swap(): List<List<integer>>;
begin
result := new List<List<integer>>;
for var i := 0 to R.count - 1 do begin
result.Add(new List<integer>);
for var j := 0 to R.count - 1 do begin
result[i].Add(R[positions[i].ToInteger][positions[j].ToInteger]);
end;
end;
end;
function calculateLength(): real;
var sum: integer;
begin
sum := 0;
for var i := 0 to R.Count - 1 do begin
for var j := 0 to R.Count - 1 do begin
sum += R[i][j] * D[i][j];
end;
end;
result := sum / 2;
end;
procedure fromFile(filename: string);
var check, check2: boolean;
begin
assign(matrixFile, filename);
reset(matrixFile);
i := 0;
while(not eof(matrixFile)) do begin
readln(matrixFile, line);
if(check = false) and (check2 = false) then begin
if(i = 0) then begin
n := line.Split(' ')[0].ToInteger;
m := line.Split(' ')[1].ToInteger;
end else if(line <> 'R') then begin
directives.Add((line.Split(' ')[0].ToInteger - 1, line.Split(' ')[1].ToInteger - 1));
end else begin
check := true;
end;
end else if(check = true) then begin
if(line = 'D') then begin
check2 := true;
check := false;
continue;
end;
R.Add(new List<integer>);
foreach var element in line.Split(' ').ToList() do begin
if(element <> '') then begin
R[R.Count - 1].Add(element.toInteger);
end;
end;
end else if(check2 = true) then begin
D.Add(new List<integer>);
foreach var element in line.Split(' ').ToList() do begin
if(element <> '') then begin
D[D.Count - 1].Add(element.toInteger);
end;
end;
end;
inc(i);
end;
close(matrixFile);
end;
procedure fromKeyboard();
begin
writeln('Введите n');
readln(n);
writeln('Введите m');
readln(m);
writeln('Введите количество директивных элементов');
var count: integer;
readln(count);
for var i := 0 to count - 1 do begin
writeln('Введите номер директивного элемента');
var element: integer;
readln(element);
writeln('Введите позицию, в которую следует поместить элемент');
var position: integer;
readln(position);
directives.Add((element, position));
end;
writeln('Введите матрицу весов поэлементно:');
for var i := 0 to n - 1 do begin
R.Add(new List<integer>);
for var j := 0 to m - 1 do begin
var temp: integer;
readln(temp);
R[i].Add(temp);
end;
end;
writeln('Введите матрицу расстояний поэлементно:');
for var i := 0 to n - 1 do begin
D.Add(new List<integer>);
for var j := 0 to m - 1 do begin
var temp: integer;
readln(temp);
D[i].Add(temp);
end;
end;
end;
Begin
R := new List<List<integer>>;
D := new List<List<integer>>;
Ir := new List<integer>;
directives := new List<(integer, integer)>;
var variant: string;
writeln('Если вы хотите осуществить ввод данных из файла, нажмите q. Если нажать любую другую клавишу, будет осуществлен ручной ввод');
readln(variant);
if(variant = 'q') then begin
fromFile('1.txt');
end else begin
fromKeyboard();
end;
positions := new List<string>;
Er := new List<integer>;
Kr := new List<integer>;
for i := 0 to R.Count - 1 do begin
positions.Add('-');
Ir.Add(i);
end;
for i := 0 to R.Count - 1 do begin
if(directives.Where(t -> t[1] = i).Count = 1) then begin
var temp := directives.Where(t -> t[1] = i).First;
positions[i] := temp[0].ToString;
Er.Add(temp[0]);
Ir.Remove(temp[0]);
end;
end;
repeat begin
for i := 0 to R.Count - 1 do begin
if(positions[i] <> '-') then begin
if(check(i - n, i)) then begin
Kr.Add(i - n);
end;
if(i mod n <> 0) then begin
if(check(i - 1, i)) then begin
Kr.Add(i - 1);
end;
end;
if((i + 1) mod n <> 0) then begin
if(check(i + 1, i)) then begin
Kr.Add(i + 1);
end;
end;
if(check(i + n, i)) then begin
Kr.Add(i + n);
end;
end;
end;
Kr.Sort();
max := -MaxInt;
foreach var e in Ir do begin
var Je := 0;
for i := 0 to R.Count - 1 do begin
if(R[e][i] <> 0) then begin
if(Er.Contains(i)) then begin
Je := Je + R[e][i];
end else begin
Je := Je - R[e][i];
end;
end;
end;
writeln('J(e', e + 1, ') = ', Je);
if(Je > max) then begin
max := Je;
index := e;
end;
end;
var TempList := new List<(integer, integer)>;
foreach var e in Er do begin
if(R[index][e] <> 0) then begin
for i := 0 to positions.Count - 1 do begin
if(positions[i] = e.ToString) then begin
break;
end;
end;
TempList.Add((R[index][e], i));
end;
end;
var F: integer;
var min := MaxInt;
var position: integer;
foreach var pos in Kr do begin
write('F(', pos + 1, ') = ');
F := 0;
foreach var val in TempList do begin
F += val[0] * D[pos][val[1]];
end;
writeln(F);
if(F < min) then begin
min := F;
position := pos;
end;
end;
positions[position] := index.ToString;
writeln('Помещаем элемент ', index + 1, ' в позицию ', position + 1);
Kr.Remove(position);
Ir.Remove(index);
Er.Add(index);
end until Ir.Count = 0;
writeln('Итоговое размещение');
for i := 0 to R.Count - 1 do begin
write((positions[i].ToInteger + 1), chr(9));
if((i + 1) mod n = 0) then begin
writeln;
end;
end;
writeln('L до размещения элементов: ', calculateLength());
R := swap();
writeln('L после размещения элементов: ', calculateLength());
writeln('Вы хотите сохранить результат работы программы в файл? Если да, нажмите s');
readln(variant);
if(variant = 's') then begin
var f: Text;
var res: string;
assign(f, 'out.txt');
Rewrite(f);
res += n + ' ' + m + #10;
for i := 0 to directives.Count - 1 do begin
res += (directives[i][0] + 1) + ' ' + (directives[i][1] + 1) + #10;
end;
res += 'R' + #10;
for i := 0 to R.count - 1 do begin
for j := 0 to R[i].count - 1 do begin
res += R[i][j] + ' ';
end;
res += #10;
end;
res += 'D' + #10;
for i := 0 to D.count - 1 do begin
for j := 0 to D[i].count - 1 do begin
res += D[i][j] + ' ';
end;
res += #10;
end;
WriteLn (f, res);
Close (f);
end;
end.