思路:
利用 横差 和 竖差 之和,找出答案。
注意:
中间输出调试 ;
分阶段测试 看到底哪一阶段的错误 ;
注意0值(特殊值)的处理 。
代码:
#include <cstring>//中间输出调试 ,分阶段测试 看到底哪一阶段的错误 ,注意0值(特殊值)的处理
#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;
int w,mm,nn;
int main()
{
cin>>w>>mm>>nn;
int ww=2*w;
int m=max(mm,nn);//因为题中并没有给出谁是最大,所以需要自己判断出来
int n=min(mm,nn);
int nm=n/ww;
int mn=m/ww;
int ym=m%ww,yn=n%ww;
if(!ym) mn--;
if(!yn) nm--;//0值处理 例如样例 8 92 16 ,虽然16/16=1,但是它属于竖着第 0 队列(9是第一队列),所以nm --
int sums=(mn-nm)*2;//sums 代表竖着差多少层
if(m%ww>w||m%ww==0) sums++;//判断它是队列的哪一层 ,m 在第二层了话sums++ ,n 在第二层了话sums--
if(n%ww>w||n%ww==0) sums--;
int yym;
int yyn;
if(ym>w)
{
yym=ym%w;//yym 是用于第二层的除余
yym=w+1-yym;//将第二层的余数与第一层对应,用于横差运算
}
else if(!ym) yym=1;//除余为0,变成1,具体看图
else yym=ym;//余数小于 w ,直接就是yym
if(yn>w)
{
yyn=yn%w;
yyn=w+1-yyn;
}
else if(!yn) yyn=1;
else yyn=yn;
int sum=abs(yyn-yym)+sums;
cout<<sum;
return 0;
}
y总的方法:
y总代码:
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int w, m, n;
cin >> w >> m >> n;
m --, n -- ;//将它模拟为一维数组的形式,这样无论 除余数 还是 除 都是方便的,具体看图分析
int x1 = m / w, x2 = n / w;
int y1 = m % w, y2 = n % w;
if (x1 % 2) y1 = w - 1 - y1;//如果它是偶数行的话,进行反转这样有利于行减。
if (x2 % 2) y2 = w - 1 - y2;
cout << abs(x1 - x2) + abs(y1 - y2) << endl;
return 0;
}