UVA 10881 Piotr's Ants

這是一道非常有意思的題目,乍一看題目描述的過程非常的複雜,直接模擬怕是要出梗。

但是,仔細在紙上進行演示和推導後,把兩隻螞蟻的相撞看作是兩隻螞蟻交換穿過對方並且交換編號即可。

不說很難,但是非常有意思,所以在這裏做個記錄

代碼如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#define clear(n,m) memset(n,m,sizeof(n))
using namespace std;
struct Ant
{
    int s, d, e, id;
}ant[10010];
char dir[][8] = { "L","Turning","R" };
bool cmp(Ant a, Ant b)
{
    return a.s < b.s;
}
int main()
{
    int N, cas = 1;
    cin >> N;
    while (N--)
    {
        int L, T, n;
        cin >> L >> T >> n;
        for (int i = 0;i < n;i++)
        {
            char dir;
            ant[i].id = i;
            cin >> ant[i].s >> dir;
            ant[i].d = (dir == 'L' ? -1 : 1);
            ant[i].e = ant[i].s + ant[i].d*T;
        }
        sort(ant, ant + n, cmp);
        bool finish = false;
        while (!finish)
        {
            finish = true;
            for (int i = 0, j = 1;j < n;i++, j++)
            {
                if (ant[i].d == 1 && ant[j].d == -1 && ant[i].e>ant[j].e&&ant[i].s < ant[j].s)
                {
                    Ant tmp = ant[i];
                    ant[i] = ant[j];
                    ant[i].id = tmp.id;
                    tmp.id = ant[j].id;
                    ant[j] = tmp;
                    finish = false;
                }
            }
        }
        for (int i = 0, j = 1;j < n;i++, j++)
        {
            if (ant[i].e == ant[j].e)
                ant[i].d = ant[j].d = 0;
        }
        printf("Case #%d:\n", cas++);
        for (int i = 0;i < n;i++)
        {
            for (int j = 0;j < n;j++)
            {
                if (ant[j].id == i)
                {
                    if (ant[j].e<0 || ant[j].e>L)
                    {
                        cout << "Fell off" << endl;
                    }
                    else
                    {
                        cout << ant[j].e << ' ' << dir[ant[j].d + 1] << endl;
                    }
                }
            }
        }
        cout << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章