UVA(10881)蚂蚁

题目大意:第一个数据代表数据组数,接下来三个数据 L T n ,分别代表棍长,时长以及蚂蚁数量,接下来n行是蚂蚁的初始位置以及初始方向。要求求出经过T秒后,各蚂蚁的状况。(相对棍子左端的距离,方向)蚂蚁相撞后会各自回头。若经过T秒后,两蚂蚁处于相同位置,则输出“该位置 + Turning”,若已离开木棍(刚好在木棍两端不算)输出“Fell off”,否则输出当前蚂蚁的状态。

这道题是一道逻辑的映射题,可以将蚂蚁看成对穿而过。他们的相对位置是不变的如图:0是转向中,1是向右-1是向左

附上ac代码:

# include <iostream>
# include <cstdlib>
# include <cstring>
# include <algorithm>
# include <cstdio>
using namespace std;

const int maxn = 10005;

struct node
{
    int id;//输入顺序
    int pos;//位置
    int dis;//方向: -1L,0转向,1R
}before[maxn], after[maxn];

bool cmp(struct node a, struct node b)
{
        return a.pos < b.pos;
}

int vis[maxn];
int main(int argc, char *argv[])
{
    int cas;
    while(cin >> cas)
    {
        for(int k = 1; k <= cas; k++)
        {
            printf("Case #%d:\n", k);
            int l, t, n;
            cin >> l >> t >> n;

            memset(vis, false, sizeof(vis));
            for(int i = 0; i < n; i++)
            {
                char c;
                int x;
                cin >> x >> c;
                before[i].pos = x;
                before[i].id = i;
                    //右是1左是0
                int d = c == 'L' ? -1 : 1;
                before[i].dis = d;
                after[i].id = 0;
                after[i].pos = x + t * d;//之后的位置
                after[i].dis = d;

            }
            sort(before, before + n,cmp);
            //记录相对顺序
            for(int i = 0; i < n; i++)//将状态记录
            {
                vis[before[i].id] = i;
            }
            //计算终态
            sort(after , after + n,cmp);
            //修改蚂蚁碰撞后的状态
            for(int i = 0; i < n - 1; i++)
            {
                if(after[i]. pos == after[i + 1].pos)
                {
                    after[i].dis = after[i + 1].dis = 0;//表示转向中
                }
            }
         /*   cout << "---" << endl;
            for(int i = 0; i < n; i++)
            {
                cout << before[i].pos << "->" << vis[i] << " -->" << after[vis[i]].pos << endl;
            }
           // cout << "----" << endl;
            for(int i = 0; i < n; i++)
            {
                cout << after[i].pos << " " << after[i].dis << endl;
            }
            */
         //   cout << "----" << endl;
            for(int i = 0; i < n; i++)
            {
                int a = vis[i];
                if(after[a].pos < 0 || after[a].pos > l)
                {
                    cout << "Fell off" << endl; //出界
                }
                else if(after[a].dis == 0)
                {
                    cout << after[a].pos << " Turning" << endl;
                }
                else if( after[a].dis == -1)
                {
                    cout << after[a].pos << " L" << endl;
                }
                else if(after[a].dis == 1)
                {
                    cout << after[a].pos << " R" << endl;
                }
            }
            cout << endl;
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/I_O_fly/article/details/84105387