题目题解
解题步骤样例数据 代码
题目
判断一个点与已知三角形的位置关系。
若点在三角形内(不含边界),输出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.
转载请注明原文地址: https://ju.6miu.com/read-26464.html