当时真是wa的怀疑人生了,结果结束就知道错在哪里了。。。
给n,x,y,d注意y有可能比x小,一步走d个距离,临近1或n不满的话直接就到1或n,然后问你能不能从x走到y,如果有,输出最小的步数。
首先,x == y 时肯定是0,
其次,|x-y|%d==0 时肯定是|x-y|/d;
再其次,若d>=n,若y!=1&&y!=n,则肯定是-1
最后看由x到1然后1到y 和由x到n然后n到y这两种方法,比较一下就ac了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int t,x,y,d,n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
cin>>t;
while(t--){
cin>>n>>x>>y>>d;
if(x == y){
cout<<0<<endl;
continue;
}
if(d>=n && y != n&&y != 1){
cout<<-1<<endl;continue;
}
if((abs(y-x))%d == 0) cout<<abs(y-x)/d<<endl;
else {
if((y-1)%d!= 0&&(n-y)%d != 0)
cout<<-1<<endl;
else if((y-1)%d== 0&&(n-y)%d == 0)cout<<min((x-2)/d+1+(y-1)/d,(n-x-1)/d+1+(n-y)/d)<<endl;
else if((y-1)%d == 0 )cout<<(x-2)/d+1+(y-1)/d<<endl;
else if((n-y)%d ==0 ) cout<<(n-x-1)/d+1+(n-y)/d<<endl;
}
}
return 0;
}