7-4 看到草原上奔跑的马儿了吗?
看到草原上奔跑的马儿了吗?
描述:
我已经爱上这片森林了。
你喜欢大海,我喜欢你。
Thematrix233看着这诗意的文字,心中十分高兴。这两句诗让他联想到了草原上飞奔的马儿。此时,Thematrix233心中突然想到一个疑问:如果给马儿一个足够大的草原,马儿去一个地方最短的时间是多少?他去向Codeoos询问这个问题。但是Codeoos只会在象棋棋盘上得到答案——但是这就够了!问题又来了:Codeoos只会研究标准棋盘的情况,一个很大的棋盘太大了,Codeoos算不出来。请你帮助Codeoos算出来马从原点跳到给定的点最少需要走几步?
(Tip:马在棋盘上走日字形,即一个(0,0)位置的马可以一步跳到的位置分别为(1,2),(2,1),(1,−2),(2,−1),(−1,2),(−2,1),(−1,−2),(−2,−1))。
输入格式:
第一行包括一个数T(1≤T≤100000),表示数据组数。
接下来有T行,每行两个数(x′,y′)(0≤x′,y′≤1e3),表示马要去的点的位置。(马每次从(0,0))开始跳。
保证不会出现x′=y′=0的情况。马可以跳到坐标为负数的位置。
输出格式:
输出T行,每行一个整数表示马跳到(x′,y′)需要的最小步数。
输入样例:
3
1 2
2 2
5 5
输出样例:
1
4
4
#include<cstdio>
#include<queue>
#include<string.h>
#include<string>
#include<map>
#include<deque>
#include<vector>
#include<iostream>
#include<utility>
using namespace std;
struct Point{
int first,second;
Point(int a,int b):first(a),second(b){
}
Point(){
}
};
int mp[1005][1005];
bool flag[1003][1003];
int main(){
int T,a,b;
int dir[]={
1,2,2,1,1,-2,2,-1,-1,2,-2,1,-1,-2,-2,-1};
queue<Point>q;
Point nowP,nextP;
memset(flag,0,sizeof(flag));
q.push(Point(0,0));
flag[0][0]=1;
while(!q.empty()){
nowP = q.front();
q.pop();
for(int i = 0;i<8;i++){
nextP=Point(nowP.first+dir[2*i],nowP.second+dir[2*i+1]);
if(nextP.first>0&&nextP.second>0&&nextP.first<=1003&&nextP.second<=1003&&!flag[nextP.first][nextP.second]){
mp[nextP.first][nextP.second]=mp[nowP.first][nowP.second]+1;
q.push(nextP);
flag[nextP.first][nextP.second]=1;
}
}
}
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
printf("%d\n",mp[a][b]);
}
return 0;
}