Algo


私信TA

用户名:749291

访问量:736

签 名:

等  级
排  名 30980
经  验 493
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 武汉科技大学
专  业

  自我简介:

解题思路: 两个坐标都以 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 人评分

  评论区

  • «
  • »