洛谷 P1355 神秘大三角

    xiaoxiao2021-03-25  90

    题目题解 解题步骤样例数据 代码

    题目

    判断一个点与已知三角形的位置关系。

    若点在三角形内(不含边界),输出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

    最新回复(0)