Area poj 1654 计算几何

题目大意

一个坐标系,从原点开始走,然后1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走。(看翻译直接无限WA),给出一串包含1-9的字符串,问你这些点所围成的面积

分析

直接用叉积求多边形面积;
链接大法好点一下
因为求的是围成图形的面积,所以叉积在最后才取绝对值/2,有小数的情况另作判断就可以
记得把第一个点记下来。
一定要开int64,血的教训。(mdzz)

代码

const
  dy:array[1..9] of longint=(1,1,1,0,0,0,-1,-1,-1);
  dx:array[1..9] of longint=(-1,0,1,-1,0,1,-1,0,1);

var
  n:longint;
  s:array[0..1000010] of longint;

procedure init;
var
  i,j,k:longint;
  ans:int64;
  x0,y0:int64;
  x1,y1:int64;
  x2,y2:int64;
  c:char;
begin
  fillchar(s,sizeof(s),0);
  ans:=0;
  while not eoln do
    begin
      read(c);
      s[0]:=s[0]+1;
      s[s[0]]:=ord(c)-48;
    end;
  if s[0]<3 then
    begin
      writeln(0);
      exit;
    end;
  x2:=dx[s[1]]; y2:=dy[s[1]];
  x0:=x2; y0:=y2;
  x1:=0; y1:=0;
  for i:=2 to s[0] do
    begin
      x1:=x2; y1:=y2;
      x2:=x2+dx[s[i]];
      y2:=y2+dy[s[i]];
      ans:=ans+(x1*y2)-(x2*y1);
    end;
  ans:=ans+(x2*y0)-(y2*x0);
  ans:=abs(ans);
  write(ans div 2);
  if ans mod 2=1 then write('.5');
  writeln;
end;

begin
  readln(n);
  while n>0 do
    begin
      init;
      readln;
      n:=n-1;
    end;
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值