分析
a[i]表示第i只蚂蚁是否相碰。
1.因为横纵坐标为-1000~1000,就枚举步数2000次就好了,因为他可能在某个带小数的坐标相碰,所以每一步走0.5而不能走1,这样的话步数就是4000次0.5而不是2000次1.
2.每一次把相碰的蚂蚁全部找出来,并且标记,在找的过程中用另外的数组b标记,因为正在找的过程是参照上一次经过排除后的蚂蚁来找的,这一次标记不能用上去。
3.做完以后把b数组更新后的值赋给a。
程序:
var
a,b:array[0..51]of boolean;
x,y:array[0..51]of real;
t:array[0..51,1..2]of real;
i,j,k,n,ans:longint;
s:string;
begin
assign(input,'ant.in');
reset(input);
assign(output,'ant.out');
rewrite(output);
readln(n);
readln(s);
for i:=1 to n do
begin
readln(x[i],y[i]);
a[i]:=true;
b[i]:=true;
if s[i]='N' then t[i,2]:=0.5 else
if s[i]='E' then t[i,1]:=0.5 else
if s[i]='S' then t[i,2]:=-0.5 else
if s[i]='W' then t[i,1]:=-0.5;
end;
for i:=1 to 4000 do
begin
for j:=1 to n do
if a[j]=true then
begin
x[j]:=x[j]+t[j,1];
y[j]:=y[j]+t[j,2];
end;
for j:=1 to n do
if a[j]=true then
begin
for k:=1 to n do
if a[k]=true then
if (j<>k) then
if (x[k]=x[j]) and (y[k]=y[j])
then
begin
b[j]:=false;
b[k]:=false;
a[0]:=false;
end;
end;
a:=b;
if a[0]=true then break;
end;
for i:=1 to n do
if a[i]=true then inc(ans);
writeln(ans);
close(input);
close(output);
end.