题目描述
有一张无限大的棋盘,你要将马从(0,0)移到(n,m)。
每一步中,如果马在(x,y),你可以将它移动到(x+1,y+2),(x+1,y−2),(x−1,y+2),(x−1,y−2),(x+2,y+1),(x+2,y−1),(x−2,y+1)或(x−2,y−1)。
你需要最小化移动步数。
每一步中,如果马在(x,y),你可以将它移动到(x+1,y+2),(x+1,y−2),(x−1,y+2),(x−1,y−2),(x+2,y+1),(x+2,y−1),(x−2,y+1)或(x−2,y−1)。
你需要最小化移动步数。
输入
第一行一个整数t表示数据组数 (1≤t≤1000)。
每组数据一行两个整数n,m (∣n∣,∣m∣≤109)。
每组数据一行两个整数n,m (∣n∣,∣m∣≤109)。
输出
每组数据输出一行一个整数表示最小步数。
样例输入
2
0 4
4 2
样例输出
2 2
首先让x、y都是正数,并且x<=y
当y<=2*x ans=(x+y)/3+(x+y)%3; 特判:(2,2)需要4步
当y>2*x c=(y-2*x)%4; ans=x+c+(y-2*x-c)/2; 特判:(0,1)需要3步
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 6 int main() 7 { 8 int t; 9 ios::sync_with_stdio(false); 10 cin.tie(0); cout.tie(0); 11 cin>>t; 12 ll x,y; 13 while(t--) 14 { 15 cin>>x>>y; 16 if(x<0) x=-x; 17 if(y<0) y=-y; 18 if(x>y) swap(x,y); 19 ll ans; 20 if(y<=2*x) 21 { 22 if(x==2&&y==2) ans=4; 23 else ans=(x+y)/3+(x+y)%3; 24 } 25 else 26 { 27 ll c=(y-2*x)%4; 28 ans=x+c+(y-2*x-c)/2; 29 if(x==0&&y==1) ans=3; 30 } 31 cout<<ans<<endl; 32 } 33 return 0; 34 }