#include<iostream> using namespace std; int main() { int w,m,n; cin>>w>>m>>n; int mx=max(m,n); int mi=min(m,n); int x; if(mx%w==0&&mx>=w) { x=mx/w; } else x=mx/w+1; if(x%2==0&&x!=1){ if(mx%w!=0)mx=w-mx%w+1; else mx=1; } else { if(mx%w!=0)mx=mx%w; else mx=w; } int y; if(mi%w==0&&mi>=w) { y=mi/w; } else y=mi/w+1; if(y%2==0&&y!=1){ if(mi%w!=0)mi=w-mi%w+1; else mi=1; } else { if(mi%w!=0)mi=mi%w; else mi=w; } int ans=0; ans=abs(mx-mi)+abs(x-y); // cout<<x<<" "<<y<<endl; // cout<<mx<<" "<<mi<<endl; cout<<ans; }
把需要求的都转化为在第一行。
要注意边界问题。
可以将每个数减一就不需要处理边界问题
#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; }