解题思路: 两个坐标都以 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分
2 人评分
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:741 |
点我有惊喜!你懂得!浏览:2114 |
字符串输入输出函数 (Java代码)浏览:1498 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:511 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:658 |
简单的a+b (C语言代码)浏览:719 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:1292 |
【矩阵】 (C++代码)浏览:999 |
1052题解(链表操作)浏览:782 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:487 |