POJ 3505 && HDU 2341 Tower Parking(简单模拟)

Description
塔式停车场,每一层都可以停车,当顾客需要取车的时候,升降机就会升降到停车的楼层,然后传输带就可以顺时针或者逆时针地进行转动,直到车的所在位置,然后升降机就降到出口处,完成取车的任务。不过过程需要注意升降机的升降位置就在上次的取车的位置开始,升降机每移动一成用时10,传送带每移动一个位置用时为5
Input
第一行为用例组数t,每组用例第一行为两个整数h和l分别表示停车场的楼层数和每一层的车位数,之后为以h*l矩阵表示停车场停车情况,-1表示该位置为空,否则表示该位置有车而该位置的数字表示取车顺序
Output
对于每组用例,输出取出全部车用时
Sample Input
2
1 5
-1 2 1 -1 3
3 6
-1 5 6 -1 -1 3
-1 -1 7 -1 2 9
-1 10 4 1 8 -1
Sample Output
25
320
Solution
简单模拟
Code

#include<iostream>
#include<cstdio>
#include<utility>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
const int MOVE=10;//升降机移动一层用时 
const int ROTATE=5;//传送带移动一个车位用时 
pii loc[2510];//记录每辆车的位置 
int car[50][50];
int p[50];//记录传送带的位置 
int h,l;
int cnt;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        cnt=0;
        scanf("%d%d",&h,&l);
        for(int i=0;i<h;i++)
            for(int j=0;j<l;j++)
            {
                scanf("%d",&car[i][j]),cnt=max(cnt,car[i][j]);//统计需要取出的车的数量 
                if(car[i][j]!=-1)//记录车的位置 
                    loc[car[i][j]].first=i,loc[car[i][j]].second=j;
            }
        for(int i=0;i<h;i++)//初始状态传送带位于第0个车位 
            p[i]=0;
        int tot=0;//初始化总用时 
        for(int c=1;c<=cnt;c++)
        {
            int i=loc[c].first;
            int j=loc[c].second;
            tot+=2*i*MOVE;//升降用时 
            tot+=ROTATE*min((p[i]-j+l)%l,(j-p[i]+l)%l);//传送带可顺时针也可逆时针,算出最短距离 
            p[i]=j;//记录传送带位置= 
        }
        printf("%d\n",tot);
    }
    return 0;
}

你可能感兴趣的:(POJ 3505 && HDU 2341 Tower Parking(简单模拟))