依题意 给出两个数
n,m 两个数的坐标分标为
x1,y1 ;
x2,y2;
所求最短距离即曼哈顿距离
d=|x2-x1|+|y2-y1|;
当我们想求两个数的行号时
按正常数组的求法 (n/w)
如果从1 开始
每一行的最后一个元素除于w的结果都比宽度+1;
所以我们从1开始
于是 每一行的元素除于w 的结果就跟其行号一致
同时我们可以发现
只要知道了该元素除于w 的结果 就知道了其行号的奇偶性
我们就知道该行应该如何排列
类比求行号
正常排列下 我们直接将元素对宽度取余就可以获得列号
于是我们加个特判 如果行号为奇数行号就将该行元素颠倒过来排序即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;
int n,m,w;
int main(){
cin>>w>>m>>n;
n--,m--;
int x1=n/w;
int x2=m/w;
int y1,y2;
if(x1%2==0){
y1=n%w;
}else{
y1=w-(n%w)-1;
}
if(x2%2==0){
y2=m%w;
}else{
y2=w-(m%w)-1;
}
//cout<<"n is"<<n<<' '<<"m is"<<m<<endl;
//cout<<x1<<' '<<x2<<' '<<y1<<' '<<y2;
int ans=abs(x1-x2)+abs(y1-y2);
cout<<ans;
return 0;
}