rt,WA 了八个点,蒟蒻太菜实在看不出来哪里有问题了,求大佬捞捞QAQ
大体思路是先特判 k=1 的情况,然后尽量跑大块,如果出生点在小块就对其进行偏移,再特判 k=2 的情况。
#include<iostream>
#include<cmath>
#include<math.h>
#define int long long
using namespace std;
int k,sx,xs,sy,ys,ex,xe,ey,ye,go[5][2]={{0,0},{+1,0},{-1,0},{0,+1},{0,-1}},ans=1e18;
int Fun(int x1,int y1,int x2,int y2){
int xx=abs(x1-x2),yy=abs(y1-y2);
if(k==2) return 2*min(xx,yy)+abs(xx-yy)/2*3;
return 2*max(abs(x1-x2),abs(y1-y2));
}
int F(int x,int y,int c){
if(c==1) return k-(x%k);
if(c==2) return x%k+1;
if(c==3) return k-(y%k);
if(c==4) return y%k+1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>k>>sx>>sy>>ex>>ey;
if(k==1){
cout<<abs(sx-ex)+abs(sy-ey);
return 0;
}
ans=abs(sx-ex)+abs(sy-ey);
xs=floor(1.0*sx/k),ys=floor(1.0*sy/k);
xe=floor(1.0*ex/k),ye=floor(1.0*ey/k);
int st1=((xs+ys)&1)^1,st2=((xe+ye)&1)^1;//是否需要偏移到大块上
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
ans=min(ans,Fun(xs+st1*go[i][0],ys+st1*go[i][1],
xe+st2*go[j][0],ye+st2*go[j][1])
+st1*F(sx,sy,i)+st2*F(ex,ey,j));
}
}
cout<<ans;
return 0;
}