S
sima12
Подскажите пожалуйста, как можно реализовать данное задание, используя p-ичный перебор.
В доску вбито N гвоздей (N<=20). Расстояния между соседними гвоздями
-натуральные числа, записанные в текстовый файл по одному в каждой строке.
Веревка длины L. Веревку нужно разрезать на несколько частей так, чтобы
каждой частью можно было связать какие-либо два соседних гвоздя и никакие два гвоздя не
были связаны более одного раза. На привязывание веревки к гвоздю уходит Р единиц
длины. Ввод P и L с клавиатуры. Вывод в текстовый файл все возможные
варианты соединения гвоздей частями веревки. Каждый вариант записать в виде строки,
состоящей из чисел 1, 2, 3, :, N (номера гвоздей), между которыми стоят пробелы (гвозди не
связаны) или знаки минус (гвозди связаны). Например, при N=4, L=19, P=1 и расстояниях между гвоздями 5, 10, 17 выходной
файл
может иметь вид:
1-2-3 4
1 2 3-4
В данной реализации меня смущает (l1-ss[j-1]-2*p)
В доску вбито N гвоздей (N<=20). Расстояния между соседними гвоздями
-натуральные числа, записанные в текстовый файл по одному в каждой строке.
Веревка длины L. Веревку нужно разрезать на несколько частей так, чтобы
каждой частью можно было связать какие-либо два соседних гвоздя и никакие два гвоздя не
были связаны более одного раза. На привязывание веревки к гвоздю уходит Р единиц
длины. Ввод P и L с клавиатуры. Вывод в текстовый файл все возможные
варианты соединения гвоздей частями веревки. Каждый вариант записать в виде строки,
состоящей из чисел 1, 2, 3, :, N (номера гвоздей), между которыми стоят пробелы (гвозди не
связаны) или знаки минус (гвозди связаны). Например, при N=4, L=19, P=1 и расстояниях между гвоздями 5, 10, 17 выходной
файл
может иметь вид:
1-2-3 4
1 2 3-4
Код:
[code]program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const n=20;
type mas = array [0..n] of integer;
var dv:mas;
procedure plus(ko:integer);
var i:integer;
begin
i:=ko;
while dv[i]=1 do
begin
dv[i]:=0;
dec(i);
end;
dv[i]:=1;
end;
var f,f1:TextFile; P,l,l1,i,j,per,g,m,k,ko,ind:integer;
ss,xx: array of integer;
b,a:boolean; str:string;
begin
assign(f,'input.txt'); assign(f1,'output.txt');
reset(f); rewrite(f1); SetLength(ss,19);
i:=0;
while not EOF(f) do
begin
readln(f,per);
ss[i]:=per;
inc(i);
end;
k:=i+1;m:=i;a:=false;
SetLength(ss,m); SetLength(xx,m);
ko:=trunc(exp((m)*ln(2)));
write('dlina verevki L='); readln(L); write('dlina na gvozd P='); readln(P);
for i:=0 to n do dv[i]:=0;
writeln('Vozmozhnie varianti:'); writeln;
repeat
l1:=l; ind:=0;
For j:=1 to m do
begin
if dv[j]=1 then
begin
if (l1-ss[j-1]-2*p)>=0 then
begin
b:=true;
l1:=l1-ss[j-1]-2*p;
xx[j-1]:=1;
end else begin b:=false;ind:=1; end;
end;
end; str:='';
if (b=true) and (l1=0) and (ind<>1) then
begin
for k:=0 to m do
begin
str:=str+IntToStr(k+1);
if (dv[k+1]=1) and (xx[k]=1) then str:=str+'-' else str:=str+' ';
end;
end;
if (str<>'') then
begin
writeln(f1,str);
writeln(str);a:=true;
end;
plus(m);
until dv[0]=1;
if not a then writeln('Net takix variantov!');
readln;
close(f);close(f1);
end.[code=delphi]