Предупреждаю темой не ошибся...
Задача:
Катя шила сарафан, у неё остался кусок треугольной (*треугольник - прямоугольный) ткани, вопрос: можно ли из указанного куска ткани вырезать два кармана (*прямоугольной формы) указанных размеров???
Пожалуйста помогите, надежда на вас, уже трое суток мучаюсь...
Что мне приходило в голову:
1) Комбинировать подстановку треугольников всевозможными способами - код слишком длинный и слишком сложный - явно неподходит...
2) брать треугольник прикладывать каждый из карманов к сторонам и отсекать от треугольника эту часть и пытаться в оставшийся вписать другой карман...
Пожалуйста помогите, срочно необходимо... до воскресения...
в худшем случае хоть алгоритм напишите (желательно с формулами)...
Вот набросал кое-что, но если честно я не уверен, надо побольше потестить
var
c_a, c_b: Extended;
function Hypotenuse(const x: Extended): Extended;
begin
Hypotenuse := -x * c_a / c_b + c_a;
end;
function CanInclude(const x, y, s_a, s_b: Extended): Boolean;
begin
CanInclude := Hypotenuse(x + s_b) >= (y + s_a);
end;
function GetSolution(s_a, s_b: Extended): Boolean;
var
_result: Boolean;
T: Extended;
begin
_result := CanInclude(0, 0, s_a, s_b);
if not _result then begin
T := s_a; s_a := s_b; s_b := T;
_result := CanInclude(0, 0, s_a, s_b);
end;
if _result then begin
_result := CanInclude(0, s_a, s_a, s_b) or CanInclude(0, s_a, s_b, s_a);
if not _result then
_result := CanInclude(s_b, 0, s_a, s_b) or CanInclude(s_b, 0, s_b, s_a);
end;
GetSolution := _result;
end;
var
s_a, s_b: Extended;
begin
c_a := 10; // катет №1
c_b := 10; // катет №2
s_a := 8; // сторона прямоуголника №1
s_b := 1; // сторона прямоуголника №2
if GetSolution(s_a, s_b) then writeln('Yes')
else writeln('No');
end.
Вообшето кармана два... Я вроде решил задачу, как с компьютера зайду (через телефон сижу)- выложу код...