您的位置:首页 > 其它

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

2015-07-15 10:36 423 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: