POJ P1654 Area

题目大意:

一个人从原点开始给出M个指令让他走,指令为1~9:
1:左下; 2:下; 3:右下;
4:左; 5:停止行走; 6:右;
7:左上; 8:上; 9:右上;
问最后走过的点围成的多边形的面积,
5仅在指令的结尾出现。
一共有T个询问,每个询问包括一串指令Si

1 ≤ t ≤ 20
指令长度 ≤ 1000000

题解:

这题很多人是因为看不懂题才做错的…
我也错了几次…
我们把相邻两点和原点组成一个三角形,
可得,S=1/2*∑S△,
而三角形面积是两个相邻边向量的叉积

代码:

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

var
     x,y,a,b,ans:int64;
     s:ansistring;
     t,i:longint;

begin
     readln(t);
     while t>=1 do
     begin
           readln(s);
           if length(s)<3 then writeln('0')
           else begin
                    ans:=0;
                    x:=0; y:=0;
                    for i:=1 to length(s) do
                      begin
                           a:=x+dx[ord(s[i])-48];
                           b:=y+dy[ord(s[i])-48];
                           ans:=ans+(a*y-x*b);
                           x:=a; y:=b;
                      end;
                    if ans<0 then ans:=-ans;
                    if ans mod 2=0
                       then writeln(ans div 2)
                       else writeln(ans div 2,'.5');
                end;
           dec(t);
     end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值