1 条题解
-
0
解题思路
这道题的关键在于将威利的螺旋编号转换为玛雅的二维六边形坐标。我们需要找到编号与坐标之间的数学关系。
关键观察
-
六边形分层结构:蜂巢可以看作由多个六边形环组成,中心是第0层,第1层有6个蜂房,第2层有12个,第3层有18个,依此类推。
- 第
k
层的蜂房数量为6*k
(k ≥ 1
)。 - 前
k
层的总蜂房数为1 + 6*(1 + 2 + ... + k) = 1 + 3k(k+1)
。
- 第
-
确定层数
k
:- 给定数字
n
,找到最小的k
使得3k(k+1) + 1 ≥ n
。 - 例如,
n=7
在第2层(因为3*2*3 + 1 = 19 ≥ 7
)。
- 给定数字
-
计算坐标:
- 中心:
(0, 0)
(n=1
)。 - 第
k
层:- 该层有
6
个边,每个边有k
个蜂房。 - 从
(0, k)
开始,按顺时针方向移动,每步调整坐标。 - 方向变化顺序:
(0, +1)
→(-1, +1)
→(-1, 0)
→(0, -1)
→(+1, -1)
→(+1, 0)
→(0, +1)
(循环)。
- 该层有
- 中心:
步骤
- 计算层数
k
:- 解不等式
3k(k+1) + 1 ≥ n
,找到最小的k
。
- 解不等式
- 计算剩余步数
m
:m = n - (3k(k-1) + 1)
(即该层内的偏移量)。
- 确定边和坐标变化:
- 每
k
步换一个方向,按六边形边的顺序调整坐标。
- 每
C++ 实现
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> using namespace std ; int main() { int a ; while(scanf("%d",&a) !=EOF) { if(a == 1) { printf("0 0\n") ; continue ; } int n = 0; while(3 * (n-1) * n + 1 < a)//3 * (n-1) * n + 1表示第n圈的最后一个数是多少 n++;//找到该数属于第几圈 n--; a -= 3*(n-1)*n+1; int x , y; //分为6个边,每个边上n个数,可以根据题目里的两个图找找规律,看看每条边上的xy的规律是多少 if(a<=n) { x = n-a; y = a; } else if(a>n&&a<=2*n) { x = n-a; y = n; } else if(a>2*n&&a<=3*n) { x = -n; y = 3*n-a; } else if(a>3*n&&a<=4*n) { x = a-4*n; y = 3*n-a; } else if(a>4*n&&a<=5*n) { x = a-4*n; y = -n; } else { x = n; y = a-6*n; } printf("%d %d\n",x,y) ; } return 0 ; }
-
- 1
信息
- ID
- 1266
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者