洛谷 P1355 神秘大三角

题目

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

若点在三角形内(不含边界),输出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.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值