题目
判断一个点与已知三角形的位置关系。
若点在三角形内(不含边界),输出1;
若点在三角形外(不含边界),输出2;
若点在三角形边界上(不含顶点),输出3;
若点在三角形顶点上,输出4。
题解
非常简单,只要你会
解题步骤:
1.读入,因为有括号,所以我只能先用字符串读,然后慢慢转成数字。这一步注意,不要忘记数据里有三位数,要打好相应的代码
2.特判点是不是在三角形的顶点上
3.用叉积公式计算点与三角形的每条边的关系,
叉积公式:
m=((x1-x0)(y2-y0))-((x2-x0)(y1-y0))
(1)m=0,则点在三角形边上。
(2)每一次计算完一条边的m都要判断m与0的大小关系有无变化,若有变化则点在三角形外
(3)所有边都判断完后,就直接输出1
注意,1和2的顺序绝不能调换,因为假如上一次m大于0,而这一次m等于0,此时若先2,上一次m<>这一次m,程序就会判断点在三角形外
样例数据
几个比较容易错的
(10,10)
(30,40)
(30,10)
(20,25) 答案是3
(1,1)
(3,4)
(1,2)
(2,3) 答案是3
(1,1)
(3,4)
(2,1)
(2,3) 答案是2
代码
var
aa,bb,cc,i,j:longint;
a:array[1..4,1..2]of longint;
s:string;
function m(x0,y0,x1,y1,x2,y2:longint):longint;
begin
m:=((x1-x0)*(y2-y0))-((x2-x0)*(y1-y0));
if m<0 then exit(-1);
if m>0 then exit(1);
end;
begin
for j:=1 to 4 do
begin
readln(s);
i:=2;
while i<length(s) do
if s[i-1]='(' then
while s[i]<>',' do
begin
a[j,1]:=a[j,1]*10+ord(s[i])-48;
inc(i);
end else
if s[i-1]=',' then
while s[i]<>')' do
begin
a[j,2]:=a[j,2]*10+ord(s[i])-48;
inc(i);
end else inc(i);
end;
for i:=1 to 3 do
if (a[4,1]=a[i,1])and(a[4,2]=a[i,2]) then begin writeln('4');exit;end;
aa:=m(a[1,1],a[1,2],a[2,1],a[2,2],a[4,1],a[4,2]);
if aa=0 then begin writeln('3');exit;end;
bb:=m(a[2,1],a[2,2],a[3,1],a[3,2],a[4,1],a[4,2]);
if bb=0 then begin writeln('3');exit;end;
if aa<>bb then begin writeln('2');exit;end;
cc:=m(a[3,1],a[3,2],a[1,1],a[1,2],a[4,1],a[4,2]);
if cc=0 then begin writeln('3');exit;end;
if aa<>cc then begin writeln('2');exit;end;
writeln('1');
end.