2017.03.18【NOIP 普及組】模擬賽C組 螞蟻 題解

原題:

http://172.16.0.132/junior/#contest/show/1376/1

題目描述:

在二維平面座標軸裏面,有N只螞蟻,第i只螞蟻所在的點的座標是(xi, yi),座標都是整數。所有螞蟻的移動速度都相等,都是每秒移動1個單位。每隻螞蟻都有一個固定的移動方向,是如下4種方向之一,都是平行於座標軸的:
l N表示向北(即朝上), 則y座標正方向。
l E表示向東(即朝右), 則x座標正方向。
l S表示向南(即向下), 則y座標負方向。
l W表示向西(即向左), 則x座標負方向。
當2只或多隻螞蟻在某個時刻碰(不一定是整數時刻)撞到一起,那麼這些螞蟻都會立即消失。例如螞蟻A的初始位置是(0, 0)且方向是向東,螞蟻B的初始位置是(1, 0)且方向是向西,那麼0.5秒後,兩隻螞蟻會在點(0.5, 0)處碰撞,兩隻螞蟻瞬間都消失。當所有的碰撞結束後,還有多少隻螞蟻存在?不管螞蟻最終移動到哪裏,只要沒有消失,都算是存在。

輸入:

第一行,一個整數N(1 ≤ N ≤ 50)。
第二行,一個長度是N的字符串,第i個字符表示第i只螞蟻的移動方向。
接下來有N行,每行兩個整數,表示螞蟻的橫座標x和縱座標y。
-1000 ≤ x,y ≤ 1000。輸入數據保證,一開始沒有兩隻螞蟻具有相同的位置。
對於50%的數據, 螞蟻的座標範圍【-100,100】。

輸出:

一個整數,表示當所有的碰撞結束後,存在的螞蟻的數量。

輸入樣例:

輸入樣例1:
4
NWNE
0 0
10 10
20 20
30 30

輸入樣例2:
4
NEWS
-10 0
0 -10
0 10
10 0

輸入樣例3:
4
EWSS
0 0
9 0
0 4
0 5

輸入樣例4:
9
EENWWSWSE
-1 0
1 0
0 0
-1 -1
1 -1
0 1
0 -1
-1 1
1 1

輸入樣例5:
5
SWNSE
-2 -1
-3 -1
-2 -3
1 3
-3 -2

輸入樣例6:
9
ESEWNNEWW
-1 -1
-1 0
-1 1
0 -1
0 0
0 1
1 -1
1 0
1 1

輸入樣例7:
4
EWEN
2 2
10 2
0 2
0 0

輸入樣例8:
3
NEN
2 0
0 2
1 1

輸入樣例9:
2
SW
-1000 1000
1000 -1000

輸出樣例:

輸出樣例1:
2

輸出樣例2:
0

輸出樣例3:
2

輸出樣例4:
5

輸出樣例5:
2

輸出樣例6:
4

輸出樣例7:
2

輸出樣例8:
1

輸出樣例9:
0

分析:

暴力,但注意每次增加0.5!!!

實現:

var
        n,i,j,ans,k:longint;
        s:string;
        x,y:array[1..50] of real;
        b,bz:array[1..50] of boolean;
begin
        assign(input,'ant.in');reset(input);
        assign(output,'ant.out');rewrite(output);
        readln(n);
        readln(s);
        for i:=1 to n do
                readln(x[i],y[i]);
        for i:=1 to 4000 do
        begin
                fillchar(bz,sizeof(bz),false);
                for j:=1 to n do
                        case s[j] of
                                'N':y[j]:=y[j]+0.5;
                                'S':y[j]:=y[j]-0.5;
                                'W':x[j]:=x[j]-0.5;
                                'E':x[j]:=x[j]+0.5;
                        end;
                for j:=1 to n-1 do
                        if not(b[j]) then
                                for k:=j+1 to n do
                                        if not(b[k]) then
                                                if (x[j]=x[k])and(y[j]=y[k]) then
                                                begin
                                                        bz[j]:=true;
                                                        bz[k]:=true;
                                                end;
                for j:=1 to n do
                        if bz[j] and not(b[j]) then
                        begin
                                b[j]:=true;
                                inc(ans);
                        end;

        end;
        writeln(n-ans);
        close(input);close(output);
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章