Wannafly summer camp Day3--Knight

题目描述

有一张无限大的棋盘,你要将马从(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)。
你需要最小化移动步数。

输入

第一行一个整数t表示数据组数 (1≤t≤1000)。
每组数据一行两个整数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 }
如有错误,请指正,感谢!
原文地址:https://www.cnblogs.com/scott527407973/p/9864600.html