专栏文章

题解:P12367 [蓝桥杯 2022 省 Python B] 蜂巢

P12367题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipgxq42
此快照首次捕获于
2025/12/03 11:49
3 个月前
此快照最后确认于
2025/12/03 11:49
3 个月前
查看原文

P12367 [蓝桥杯 2022 省 Python B] 蜂巢

解题思路

容易发现蜂巢间的移动可以看作向量,因此可以构建下图坐标系:
所以,正西方向可以看作为 (1,0)(-1,0),西偏北 6060^\circ 可以看作为 (0,1)(0,1),东偏北 6060^\circ 可以看作为 (1,1)(1,1),正东可以看作为 (0,1)(0,1),表示东偏南 6060^\circ 可以看作为 (0,1)(0,-1),西偏南 6060^\circ 可以看作为 (1,1)(-1,-1)
接着就能够计算出从定点 (d1,p1,q1)(d_1, p_1, q_1) 到点 (d2,p2,q2)(d_2, p_2, q_2) 的向量 P1P2\overrightarrow{P_1P_2},记为 (x,y)(x,y)。然后求出答案。
此时还应当判断 xxyy 的符号。若为同号,可以先在 (1,1)(1,1) 方向上移动,答案为 max{x,y}\max\{|x|,|y|\};若为异号,则答案为 x+y|x|+|y|

完整代码

C++:

CPP
#include<stdio.h>
#include<algorithm>
using namespace std;
const int dt[8][4]={{-1,0},{0,1},{1,1},{1,0},{0,-1},{-1,-1}};
int a,b,c,d,e,f;
inline int p(int d)
{
	return (d+2)%6;
}
int main()
{
	scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
	int x=0,y=0,ans;
	x=dt[a][0]*b+dt[p(a)][0]*c-dt[d][0]*e-dt[p(d)][0]*f;
	y=dt[a][1]*b+dt[p(a)][1]*c-dt[d][1]*e-dt[p(d)][1]*f;
	if((x>0&&y>0)||(x<0&&y<0))ans=max(abs(x),abs(y));
	else ans=abs(x)+abs(y);
	printf("%d",ans);
	return 0;
}

Python:

PY
def p(x):
	return (x+2)%6
dt=((-1,0),(0,1),(1,1),(1,0),(0,-1),(-1,-1))
a,b,c,d,e,f=map(int,input().split())
x=dt[a][0]*b+dt[p(a)][0]*c-dt[d][0]*e-dt[p(d)][0]*f
y=dt[a][1]*b+dt[p(a)][1]*c-dt[d][1]*e-dt[p(d)][1]*f
ans=0
if x*y>0:
	ans=max(abs(x),abs(y))
else:
	ans=abs(x)+abs(y)
print(ans)

评论

0 条评论,欢迎与作者交流。

正在加载评论...