现在的位置: 首页 > 综合 > 正文

POJ 3930 Elevator 模拟

2018年04月25日 ⁄ 综合 ⁄ 共 2737字 ⁄ 字号 评论关闭

题意:给n条指令,模拟电梯的运行过程。

Sure原创,转载请注明出处。

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxn = 102;
struct instuction
{
    int t,up;
    int fr,to;
    bool operator < (const instuction &other) const   //指令排序,up == 1为向上走的指令
    {
        if(t == other.t)
        {
            return up > other.up;
        }
        return t < other.t;
    }
}ins[maxn];
int wait[maxn >> 1][2][maxn],num[maxn >> 1][2],inside[maxn >> 1];  //wait[i][j][k]表示当前在i楼想向下(向上)走的第k个人想到达的楼层
int n,layer,ti;  // layer表示当前电梯所在的层数                         inside[i]表示在电梯中的人想到i楼层的人数

void read()
{
    memset(wait,0,sizeof(wait));
    memset(num,0,sizeof(num));
    memset(inside,0,sizeof(inside));
    scanf("%d %d",&layer,&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d %d",&ins[i].t,&ins[i].fr,&ins[i].to);
        ins[i].up = (ins[i].fr <= ins[i].to);
    }
    sort(ins , ins + n);
    return;
}

bool check(int d)   //判断电梯在d方向是否还有走下去的意义
{
    if(d == 1)
    {
        for(int i=layer+1;i<=50;i++)
        {
            if(num[i][0] || num[i][1] || inside[i])
            {
                return false;
            }
        }
        return true;
    }
    if(d == 0)
    {
        for(int i=layer-1;i>0;i--)
        {
            if(num[i][0] || num[i][1] || inside[i])
            {
                return false;
            }
        }
        return true;
    }
}

void solve()
{
    int l = 0,dir = -1;  //l表示已经扫过的指令,dir代表当前电梯的前进方向,0表示向下,1表示向上,-1表示不确定
    bool idle = true,close = true,run = false;  //idle表示当前电梯是否处于无所事事的状态,close表示当前门是否关闭,run表示电梯是否在运行中
    while(l < n || !idle)
    {
        if(idle)
        {
            idle = false;
            ti = ins[l].t;
            continue;
        }
        while(l < n && ins[l].t <= ti)  //处理指令
        {
            wait[ins[l].fr][ins[l].up][num[ins[l].fr][ins[l].up]] = ins[l].to;
            num[ins[l].fr][ins[l].up]++;
            l++;
        }
        if(dir == -1)  //如果不确定就根据提议确定出方向
        {
            if(num[layer][1]) dir = 1;
            else if(num[layer][0]) dir = 0;
            else
            {
                for(int i=layer+1;i<=50;i++)
                {
                    if(num[i][1] || num[i][0])
                    {
                        dir = 1;
                        break;
                    }
                }
                if(dir == -1)
                {
                    for(int i=layer-1;i>0;i--)
                    {
                        if(num[i][1] || num[i][0])
                        {
                            dir = 0;
                            break;
                        }
                    }
                }
                if(dir == -1)
                {
                    run = false;
                    idle = true;
                }
            }
            continue;
        }
        if(num[layer][dir] || inside[layer] || close == false)  //如果在当前层需要停下
        {
            if(close)
            {
                close = false;
                if(run) printf("%02d:%02d The elevator stops at floor %d.\n",ti / 60 , ti % 60 , layer);
                printf("%02d:%02d The elevator door is opening.\n",ti / 60 , ti % 60);
                run = false;
                ti++;
            }
            else if(inside[layer])
            {
                printf("%02d:%02d %d people leave the elevator.\n",ti / 60 , ti % 60 , inside[layer]);
                ti++;
                inside[layer] = 0;
                if(check(dir)) dir = -1;
            }
            else if(num[layer][dir])
            {
                for(int i=0;i<num[layer][dir];i++)
                {
                    inside[wait[layer][dir][i]]++;
                }
                printf("%02d:%02d %d people enter the elevator.\n",ti / 60 , ti % 60 , num[layer][dir]);
                ti++;
                num[layer][dir] = 0;
            }
            else
            {
                close = true;
                printf("%02d:%02d The elevator door is closing.\n",ti / 60 , ti % 60);
                ti++;
            }
        }
        else if(dir == 1)  //向上走
        {
            if(check(dir) == false)
            {
                if(run == false)
                {
                    printf("%02d:%02d The elevator starts to move up from floor %d.\n",ti / 60 , ti % 60 , layer);
                    run = true;
                }
                ti++;
                layer++;
            }
            else dir = -1;
        }
        else    //向下走
        {
            if(check(dir) == false)
            {
                if(run == false)
                {
                    printf("%02d:%02d The elevator starts to move down from floor %d.\n",ti / 60 , ti % 60 , layer);
                    run = true;
                }
                ti++;
                layer--;
            }
            else dir = -1;
        }
    }
    printf("%02d:%02d The elevator door is closing.\n\n",ti / 60 , ti % 60);    //最后需要把门关上
    return;
}

int main()
{
    freopen("in.txt","r",stdin);
    int cas;
    scanf("%d",&cas);
    for(int i=1;i<=cas;i++)
    {
        printf("Case %d:\n",i);
        read();
        solve();
    }
    return 0;
}

抱歉!评论已关闭.