ACM复习(36)9521 射了多少 II

Description

大家都知道CS中的AWP可以一枪KO人家,最爽的就是没看到别人,但知道人家在墙后而一枪穿墙爆头击毙.
现在把CS地图定义为一个三维空间,你的位置在(x0,y0,z0),你不知道敌人的位置(除非有间谍),因此你想尽可能多的穿过地图上的格子.
但你不知道如何计算当他射向点(x1,y1,z1)(到x1,y1,z1停下来)的时候穿过了多少个格子,因此希望你这个强大的programmer帮忙

输入格式
输入中一共有两行
第一行是3个整数表示你的位置x0,y0,z0(1000>=x0,y0,z0>=0)
第二行是3个整数表示子弹停下的位置x1,y1,z1(1000>=x1,y1,z1>=0)

输出格式
输出只有一行
穿过的格子数(碰到不算穿过任何格子,要严格穿过)

输入样例
0 0 0
2 2 2

输出样例
2


解题思路

还记的 9505 射了多少 这题么?按照这题的思路再拿个魔方观察一下就可以得出相似的规律:

这里写图片描述

#include<stdio.h>
#include<math.h>
int gcd(int a, int b);
int main()
{
    int x1, y1, z1, x2, y2, z2, dx, dy, dz;
    scanf("%d %d %d", &x1, &y1, &z1);
    scanf("%d %d %d", &x2, &y2, &z2);
    dx = fabs(x1 - x2);
    dy = fabs(y1 - y2);
    dz = fabs(z1 - z2);
    if(dx && dy &&dz)
        printf("%d\n", dx + dy + dz - gcd(dx, dy) - gcd(dx, dz) - gcd(dy, dz) + gcd(gcd(dx, dy), dz));
    else
        printf("0\n");
    return 0;
}
int gcd(int a, int b)
{
    int r;
    while((r = a % b) != 0)
    {
        a = b;
        b = r;
    }
    return b;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值