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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值