题目大意:
一个人从原点开始给出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.