2017年10月07日普及组 蚂蚁

这里写图片描述
这里写图片描述

分析
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.

原文地址:https://www.cnblogs.com/YYC-0304/p/9500039.html