Codeforces Round #503 (by SIS, Div. 2)
​​​A. New Building for SIS​​​
题意:从一个塔的某一层到另一个塔的某一层,需要的最短时间。条件:每上下一层都要一秒,每从一个塔去临近的塔需要一秒,每个塔去临近的塔只有a-b层有通道去。
思路:分类讨论一下。
1、当出发地和目的地是同一个塔:abs(fa-fb)
2.1、当出发地和目的地不同塔:但是有一个在有通道范围内,或者两者都不在范围内但一个<=a一个>=b:abs(ta-tb)+abs(fa-fb)
2.2、当出发和目的地楼层都<=a:abs(ta-tb)+abs(fa-a)+abs(fb-a)
2.3、当出发地和目的地楼层都>=b:abs(ta-tb)+abs(fa-b)+abs(fb-b)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<cmath>
using namespace std;
int main()
{
int n,h,a,b,k;
int ta,fa,tb,fb;
while(scanf("%d%d%d%d%d",&n,&h,&a,&b,&k)!=EOF)
{
while(k--)
{
scanf("%d%d%d%d",&ta,&fa,&tb,&fb);
if(ta==tb)
{
printf("%d\n",abs(fa-fb));
}
else
{
int ans=0;ans+=abs(ta-tb);
if((fa>=a&&fa<=b)||(fb>=a&&fb<=b)||(fa<=a&&fb>=b)||(fa>=b&&fb<=a))
{
ans+=abs(fa-fb);
printf("%d\n",ans);
}
else if(fa<=a&&fb<=a)
{
ans+=abs(fa-a)+abs(fb-a);
printf("%d\n",ans);
}
else if(fa>=b&&fb>=b)
{
ans+=abs(fa-b)+abs(fb-b);
printf("%d\n",ans);
}
}
}
}
return 0;
}