Knight
题目描述:
有一张无限大的棋盘,你要将马从 (0,0) ( 0 , 0 ) 移到 (n,m) ( n , m ) 。
每一步中,如果马在 (x,y)(x,y) ( x , y ) ( x , y ) ,你可以将它移动到 (x+1,y+2)(x+1,y+2) ( x + 1 , y + 2 ) ( x + 1 , y + 2 ) ,
(x+1,y−2)(x+1,y−2) ( x + 1 , y − 2 ) ( x + 1 , y − 2 ) , (x−1,y+2)(x−1,y+2) ( x − 1 , y + 2 ) ( x − 1 , y + 2 ) , (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+2,y−1(x+2,y−1) ( x + 2 , y − 1 ( x + 2 , y − 1 ) , (x−2,y+1)(x−2,y+1)或(x−2,y−1)(x−2,y−1) ( x − 2 , y + 1 ) ( x − 2 , y + 1 ) 或 ( x − 2 , y − 1 ) ( x − 2 , y − 1 ) 。
你需要最小化移动步数。
输入:
第一行一个整数tt表示数据组数 (1≤t≤1000) ( 1 ≤ t ≤ 1000 ) 。
每组数据一行两个整数 n,m(|n|,|m|≤109) n , m ( | n | , | m | ≤ 10 9 ) 。
输出:
每组数据输出一行一个整数表示最小步数。
样例输入
2
0 4
4 2
样例输出
2
2
#include
#include
using namespace std;
int dir[8][2] = {
{1,2},{1,-2},{-1,2},{-1,-2},
{2,1},{2,-1},{-2,1},{-2,-1}
};
int n, m;
int maze[1100][1100];
bool vis[1100][1100];
struct Point {
int x, y, step;
Point(int _x, int _y, int _step) :
x(_x), y(_y), step(_step) {}
};
void bfs(int sx, int sy)
{
queue q;
q.push(Point(sx, sy, 0));
vis[sx][sy] = 1;
maze[sx][sy] = 0;
while (!q.empty())
{
int x = q.front().x;
int y = q.front().y;
int step = q.front().step;
maze[x][y] = step;
q.pop();
for (int i = 0; i < 8; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (!vis[tx][ty]&&tx<61&&ty<61&&tx>=0&&ty>=0)
{
q.push(Point(tx, ty, step + 1));
vis[tx][ty] = 1;
}
}
}
}
int main() {
//freopen("1.txt", "w", stdout);
bfs(30, 30);
for (int i = 0; i < 60; i++) {
for (int j = 0; j <60; j++) {
cout << maze[i][j] << " ";
}
cout << endl;
}
return 0;
}
double(x-y-y)/4.0*2;
最后将上面这个值取反 +x−y + x − y 就是答案。同理可以推出 y=x/2 y = x / 2 上方的点,满足关系 y>x/2 y > x / 2 ,在刚才所说的八边形的3层边上,最后推出
double(x-y-y)/3.0*2;
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll fun(ll x, ll y) {
if (x == 1 && y == 0) {
return 3;
}
if (x == 2 && y == 2) {
return 4;
}
ll delta = x - y;
if (y>delta) {
return delta - 2 * floor(((double)(delta-y)) / 3.0);
}
else {
return delta - 2 * floor(((double)(delta-y)) / 4.0);
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
ll x, y;
cin >> x >> y;
x = abs(x);
y = abs(y);
if (x < y) {
swap(x, y);
}
cout << fun(x, y) << endl;
}
return 0;
}