题目大意
一个坐标系,从原点开始走,然后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.