7-4 看到草原上奔跑的马儿了吗?

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43399489/article/details/114745907
7-4