#include<iostream.h>
#define Max 10
//定义请求的磁盘位子
struct request
{
int ZM;
int CD;
int BID;
int status; //标识是否被访问
int total; //标识磁盘的相对位子大小
};
void requestSort(struct request a[],struct request b[],struct request cur,int n,int flag);
void main(){
struct request a[Max];
struct request b[Max];
struct request cur;
int n,flag,i,totalmove;
cout<<"input you request num(less 10):";
cin>>n;
cout<<"input you request direction(0->down,1->up):";
cin>>flag;
cout<<"input the current position,ZM:";
cin>>cur.ZM;
cout<<"input the current position,CD:";
cin>>cur.CD;
cout<<"input the current position,BID:";
cin>>cur.BID;
cur.total=cur.ZM*100+cur.CD*10+cur.BID;
for(i=0;i<n;i++){
cout<<"input a["<<i<<"]'s ZM(0~~9):";
cin>>a[i].ZM;
cout<<"input a["<<i<<"]'s CD(0~~9):";
cin>>a[i].CD;
cout<<"input a["<<i<<"]'s BID(0~~9):";
cin>>a[i].BID;
a[i].total=a[i].ZM*100+a[i].CD*10+a[i].BID;
a[i].status=0;
}
requestSort(a,b,cur,n,flag);
cout<<endl<<"执行顺序是: "<<endl;
for(i=0;i<n;i++){
cout<<"ZM:"<<b[i].ZM<<"->CD:"<<b[i].CD<<"->BID:"<<b[i].BID<<endl;
if(i==0){
if(flag==1){
totalmove=b[i].total-cur.total;
}else{
totalmove=cur.total-b[i].total;
}
}else{
if(b[i].total<b[i-1].total){
totalmove=totalmove+b[i-1].total-b[i].total;
}else{
totalmove=totalmove+b[i].total-b[i-1].total;
}
}
}
cout<<"总共移动了:"<<totalmove<<endl;
}
//将输入的请求按电梯的方式进行排序
void requestSort(struct request a[],struct request b[],struct request cur,int n,int flag){
int i,j=0,k,flag1,min;
while(j<n){
//position is up
min=6000;
if(flag==1){
flag1=0;
for(i=0;i<n;i++){ //遍历数组,将与当前位子的距离最小的请求依次放入数组B中
if(cur.total<=a[i].total && a[i].status==0){
if(min>=(a[i].total-cur.total)){
flag1=1;
min=a[i].total-cur.total;
k=i;
}
}
}
if(flag1==0){
flag=0;
j--;
}else{
a[k].status=1;
b[j].ZM=a[k].ZM;
b[j].CD=a[k].CD;
b[j].BID=a[k].BID;
b[j].total=b[j].ZM*100+b[j].CD*10+b[j].BID;
}
}else{ //position is down
flag1=0;
for(i=0;i<n;i++){ //遍历数组,将与当前位子的距离最小的请求依次放入数组B中
if(cur.total>a[i].total && a[i].status==0){
if(min>=(cur.total-a[i].total)){
flag1=1;
min=cur.total-a[i].total;
k=i;
}
}
}
if(flag1==0){
flag=1;
j--;
}else{
a[k].status=1;
b[j].ZM=a[k].ZM;
b[j].CD=a[k].CD;
b[j].BID=a[k].BID;
b[j].total=b[j].ZM*100+b[j].CD*10+b[j].BID;
}
}
j++;
}
}