解题思路: 两个坐标都以 0, 2两个方向进行转化(可以任意选择一组方向), 每一个坐标会涉及到两次转化(因为由题意可得每个坐标是有两个中间过程的, 先向一个方向走,再向顺时针120方向走), 对于一个坐标分别将两次转化的对应分量相加即可
注意事项: 在转化完后得到两个坐标在0, 2方向上的分量 a, b, 和 c, d 后 需要进行一个分类根据两个坐标的位置关系分别得出对应的结果(开始只考虑了一种情况只过了50 %, 哈哈).
参考代码:
#include <stdio.h>
//两个坐标都以0, 2 两个方向为基准进行转化
int Max(int a, int b);
void Transform(int d, int p, int* p0, int* p2); //d为方向,p为原方向的步数,p0为转化后在0方向的步数,p2为进行转化后在2方向的步数(要进行修改,所以传地址)
int main(void)
{
int a = 0, b = 0;
int c = 0, d = 0;
int d1, p1, q1;
int d2, p2, q2;
scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%d", &d1, &p1, &q1, &d2, &p2, &q2);
//转化过程
Transform(d1, p1, &a, &b);
Transform((d1 + 2) % 6, q1, &a, &b);
Transform(d2, p2, &c, &d);
Transform((d2 + 2) % 6, q2, &c, &d);
//分类过程(这一步需要自己画图考虑)
if ((a + 1 > c && b < d) || (a + 1 < c && b > d))
{
printf("%d\n", abs(a - c) + abs(b - d));
}
else
{
printf("%d\n", Max(abs(a - c), abs(b - d)));
}
return 0;
}
int Max(int a, int b)
{
return a > b ? a : b;
}
void Transform(int d, int p, int* p0, int* p2)
{
switch (d)
{
case 0:
*p0 += p;
break;
case 1:
*p0 += p;
*p2 += p;
break;
case 2:
*p2 += p;
break;
case 3:
*p0 += -p;
break;
case 4:
*p0 += -p;
*p2 += -p;
break;
case 5:
*p2 += -p;
break;
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复