Bài 76/2001 - Đoạn thẳng và hình chữ nhật
(Dành cho học sinh PTTH)
Thuật toán:
- Xét đoạn thẳng cắt với từng cạnh của hình chữ nhật, điều kiện cắt của đoạn thẳng với một đoạn thẳng khác
(cạnh của hình chữ nhật) là:
+ Hai đầu của đoạn thẳng khác phía với đoạn thẳng của hình chữ nhật;
+ Hai đầu của đoạn thẳng hình chữ nhật khác phía với đoạn thẳng.
Chương trình:
Program Bai76;
const inp= ‘input.txt’;
out= ‘output.txt’;
function cat (xs, ys, xe, ye, xl, yt, xr, yb: real): boolean;
var a, b, x, y: real;
lg1, lg2: boolean;
Begin
if xs=xe then
begin
lg1:=(xs<xl) or (xs>xr) or ((ys>yt) and (ye>yt)) or ((ys<yb) and (ye<yb));
lg2:=(xs>xl) and (xs<xr) and (ys<yt)and (ye<yt) and (ys>yb) and (ye>yb);
cat:=not (lg1 or lg2);
end
else begin
if ys=ye then
lg1:=((xs<xl) and (xe<xl)) or ((xs>xr) and (xe>xr)) or (ys>yt) or (ys<yb));
lg2:=(xs>xl) and (xe>xl) and (xs<xr)and (xe<xr) and (ys<yt) and (ys>yb);
cat:=false;
a:=(ys-ye)/(xs-xe);
b:=ys-a*xs;
y:= a*xl+b;
if(y<=yt)and(y>=yb)then cat:= true;
y: =a*xr+b;
if(y<=yt)and(y>=yb)then cat:=true;
x:=(yt-b)/a;
if (x>=xl)and (x<=xr)then cat:=true;
x:=(yb-b)/a;
end;
procedure xuly;
var n, i: word; xs, ys, xe, ye, xl, yt, xr, yb: real;
fi, fo: text;
assign(fi, inp); reset (fi);
assign (fo, out); rewrite(fo);
readln(fi, n);
for i:=1 to n do begin
readln (fi, xs, ys, xe, ye, xl, yt, xr, yb);
if cat (xs, ys, xe, ye, xl, yt, xr, yb) then writeln (fo, ‘T’)
else writeln(fo, ‘F’);
end;
close (fi);
close (fo);
BEGIN
xuly;
END.
(Lời giải của bạn Lê Mạnh Hà - Lớp 10A Tin - Khối PTCTT - ĐHKHTN - ĐHQG Hà Nội)
Bạn đang xem bài 76/ - 100 DE TIN HSG CO DAP AN