列表

详情


NC222519. Honeycomb

描述

小F最近在研究蜂巢,如下图所示,这是一个蜂巢的横剖图,每一个格子都是一个正六边形,多个格子平铺构成一个无限大的平面。我们以中央的格子作为原点,按照下图规律,一圈一圈向外将每个格子都编上号。

小F想知道,如果一个蜜蜂当前在编号为x的格子处,它想到达编号为y的格子,最优情况下它最少需要经过多少个格子(包含起点终点)。蜜蜂在蜂巢里只能爬行,也就是说它每次只能爬到相邻的格子里。
你需要支持多组询问。

输入描述

第一行,一个整数 ,表示有T组询问。
对于每组询问,输入一行。每行两个正整数 ,表示两个格子的编号。

输出描述

对于每组询问,输出一行。每行一个整数,表示两个格子之间的格子数量。

示例1

输入:

6
3 6
1 12
12 18
12 23
48 60
42 54

输出:

3
3
5
4
9
9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 392ms, 内存消耗: 1192K, 提交时间: 2023-07-29 21:23:16

#include<bits/stdc++.h>
using namespace std;
using i64=long long;
const int dx[] = {1, 0, -1, -1, 0, 1};
const int dy[] = {0, 1, 1, 0, -1, -1};
int T, num, x[2], y[2], ans;
vector<int> z;
int main() {
    for (int i = 0; i * (i - 1) * 3 + 1 <= 1000000000; i++)
        z.push_back(i * (i + 1) * 3 + 1);
    cin>>T;
    while (T--) {
        memset(x, 0, sizeof(x));
        for (int i = 0; i < 2; i++) {
            cin>>num;
            int p = lower_bound(z.begin(), z.end(), num) - z.begin();
            y[i] = -p, num = z[p] - num;
            for (int j = 0, l; j < 6 && num; j++) {
                l = min(num, p), num -= l;
                x[i] += dx[j] * l;
                y[i] += dy[j] * l;
            }
        }
        x[0] -= x[1], y[0] -= y[1];
        if (x[0] * y[0] > 0) ans = abs(x[0]) + abs(y[0]) + 1;
        else ans = max(abs(x[0]), abs(y[0])) + 1;
        cout<<ans<<"\n";
    }
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 288ms, 内存消耗: 3008K, 提交时间: 2023-05-18 18:18:11

#include<bits/stdc++.h>
using namespace std;
int t;
int dx[6]={1,0,-1,-1,0,1},dy[6]={0,1,1,0,-1,-1},x[2],y[2];
vector<int>seq;
int main()
{
	
	for(int  i=0;3*i*(i-1)+1<1e9;i++)seq.push_back(i*3*(i+1)+1);
	scanf("%d",&t);
	while(t--)
	{
		for(int i=0;i<2;i++)
		{
			int q;
			scanf("%d",&q);
			int idx=lower_bound(seq.begin(),seq.end(),q)-seq.begin();
			int dif=seq[idx]-q;
			y[i]=-idx;
			x[i]=0;
			for(int j=0;j<6&&dif;j++)
			{
				int tmp=min(dif,idx);
				dif=dif-tmp;
				x[i]+=dx[j]*tmp;
				y[i]+=dy[j]*tmp;
			}
		}
		int x0=x[0]-x[1],y0=y[0]-y[1];
		if(x0*y0<0)cout<<max(abs(x0),abs(y0))+1<<endl;
		else cout<<abs(x0)+abs(y0)+1<<endl;
	}
	return 0;
}

上一题