算法1
(数学解决问题) $O(1)$
思路:我们只需要将给定的楼号转化为二维坐标(x1,y1),(x2,y2),即可轻松的求出它们之间的距离,
即为|x2-x1|+|y2-y1|,(因为不能斜线距离移动),例如(1,3),(2,4)之间的距离为2
那么我们就只需要将m,n转化为坐标值(x,y),根据题意奇数行是从小到大排序的,而偶数行是从大到小排序的,
那么我们分情况讨论,就可以给出楼号到坐标之间的转化公式。
参考文献
C++ 代码
//转化成二维坐标,那么m,n的距离变为--》|x1-x2|+|y1-y2|
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int N=10010;
int a[N][N];
int w,m,n;
int main(){
cin>>w>>m>>n;
int x1,y1,x2,y2;
x1=(m+w-1)/w;
if(x1%2==1){//奇数行
y1=m%w;
if(y1==0) y1=w;
}
else y1=(w-m%w+1)%w;//偶数行
x2=(n+w-1)/w;
if(x2%2==1) //奇数行
{
y2=n%w;
if(y2==0) y2=w;
}
else y2=(w-n%w+1)%w;//偶数行
int res=abs(x2-x1)+abs(y2-y1);
printf("%d",res);
}