1. 程式人生 > >算法競賽入門經典-訓練指南(10881-Piotr's Ants)

算法競賽入門經典-訓練指南(10881-Piotr's Ants)

log else char order 數組保存 logs code color 速度

題目大意:

一根長度為L的木棍一堆螞蟻爬,向左或向右,速度都為1,若兩螞蟻碰撞則同時轉頭(轉身時間忽略不計),問T時間之後每只螞蟻的位置;

輸入:t,(t個樣例),每個樣例輸入 L,T,n,接下來是n行每行兩個數據,一個POS(位置),一個dir(方向);

輸出:按輸入順序輸出每只螞蟻的最終位置,若處於碰撞狀態則輸出Turning,掉下去輸出”Fell off“;

解題思路:

本題類似於《挑戰程序設計》的一道水題(POJ -1852 Ants),思路題;不過本題輸入並不一定是按照位置大小進行輸入的,因此,需要一個order數組進行預處理,具體看代碼及註釋;

AC代碼:

#include <iostream>
#include 
<algorithm> #include <cmath> using namespace std; /**************************************************** 樣例: 2 10 1 4 1 R 5 R 3 L 10 R ****************************************************/ const int maxn = 10000; struct ant { int id; //輸入順序; int pos; //
實際位置; int dir; //朝向: }before[maxn],after[maxn]; bool cmp(ant a,ant b) //按照位置進行排序 { return a.pos<b.pos; } const char dire[][10]={"L","Turning","R"}; //數組保存輸出結果 int order[maxn]; //order數組的作用是保存各螞蟻終態的相對位置; int main() {
int t1; cin>>t1; for (int kase=1;kase<=t1;kase++) { cout<<"Case #"<<kase<<":"<<endl; int l,t,n; cin>>l>>t>>n; for (int i=0;i<n;i++) { int x; char c; cin>>x>>c; int d=(c==L?-1:1); before[i]=ant{i,x,d}; after[i]=ant{0,x+d*t,d}; //朝向依舊是d,因為必有一只螞蟻的朝向是原來的d,比如(1,R)->(3,R),只不過不知道是那只螞蟻; } sort(before,before+n,cmp); for (int i=0;i<n;i++) { order[before[i].id]=i; //before[i].id 是原來數組的輸入順序,現在before按照位置進行排序,那麽此時對應的就是當前位置螞蟻的編號; //比如樣例中排序後before[1]是位置3的螞蟻,其順序為3,那麽就是order[3]=2; //那麽樣例中的order就是 1 3 2 4; //之後after數組的輸出after[order[1]].pos就是5這個位置的末位置; } sort(after,after+n,cmp); for (int i=0;i<n-1;i++) { if (after[i].pos==after[i+1].pos) { after[i].dir=after[i+1].dir=0; } } for (int i=0;i<n;i++) { int a=order[i]; if (after[a].pos < 0||after[a].pos>l) cout<<"Fell off"<<endl; else { cout<<after[a].pos<<" "<<dire[after[a].dir+1]<< endl; } } cout<<endl; } return 0; }

算法競賽入門經典-訓練指南(10881-Piotr's Ants)