分析
这一题自己太傻了,其实在转换成为坐标进行运算的时候,把你要算的楼号减1的话就很好计算得到一个正确的从0~n-1的坐标,无需进行各种的边界判断。(听说这也是C++下标从0开始的原因?)由于我没有把楼号减1,因此算的时候出现了各种各样的边界问题,然后就是各种不对,在VS上调试了半天,要不是AcWing把错的数据放出来,那这题就凉凉了。
蓝桥杯好像连错没错都不知道?那这题必然凉凉。。。❄️❄️❄️
假如没有把楼号减1直接算从0~n-1的坐标的边界
特判偶数行最左端的值,该值求得的i坐标会比该行其他的i坐标多1
特判奇数行最右端的值,该值求得的j坐标会为0
代码
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int w,m,n;
scanf("%d%d%d",&w,&m,&n);
int m1,m2,n1,n2;
m1=m/w;
if(m%w==0) m1--;//是为了特判偶数行最左端的值,该值求得的坐标会会比其他的i坐标多1
if(m1%2==0){
if(m%w==0) n1=w-1;//为了特判奇数行最右端的值,该值求得的j坐标会为0,这显然不是我们想要的,我们想要它直接等于w-1
else n1=m%w-1;
}
else{
n1=w-m%w;
}
m2=n/w;
if(n%w==0) m2--;
if(m2%2==0){
if(n%w==0) n2=w-1;
else n2=n%w-1;
}
else{
n2=w-n%w;
}
cout<<abs(m1-m2)+abs(n1-n2);
return 0;
}
顺便附上yls的代码
#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;
}