Skip to content

喵~ 主人,欢迎来到本喵的题解小课堂!今天我们要看的是一道关于立体几何的简单题目,Codeforces 39D - Cubical Planet。别看是D题,其实超级简单的,让本喵带你一步一步把它搞定吧!

题目大意

在一个遥远的星系里,有一颗立方体形状的行星,喵~ 好神奇!为了方便研究,我们建立了一个三维坐标系。这个立方体行星的顶点坐标都是由0和1组成的,比如它的两个对角顶点分别是 (0, 0, 0) 和 (1, 1, 1)。

现在,这个行星上有两只小苍蝇,它们分别停在立方体的两个不同的顶点上。我们需要判断的是:这两只小苍蝇能不能互相看见对方?

看见对方的条件是:它们所在的两个顶点位于立方体的同一个面上。

输入是两行,每行三个数字(0或1),分别代表两只苍蝇所在顶点的 (x, y, z) 坐标。如果它们能看见对方,我们就输出 "YES";如果不能,就输出 "NO"。

题解方法

让本喵来想一想... 两只苍蝇在同一个面上,这是什么意思呢?

一个立方体有6个面,对吧喵?我们来看看在这个坐标系里,这些面是怎么定义的。

  • x = 0 的面:这个面上的所有点的 x 坐标都是 0。比如 (0, 0, 0), (0, 1, 0), (0, 0, 1), (0, 1, 1) 这四个顶点就在这个面上。
  • x = 1 的面:同理,这个面上的所有点的 x 坐标都是 1。
  • y = 0 的面:所有点的 y 坐标都是 0。
  • y = 1 的面:所有点的 y 坐标都是 1。
  • z = 0 的面:所有点的 z 坐标都是 0。
  • z = 1 的面:所有点的 z 坐标都是 1。

喵呜!本喵发现了一个规律!如果两个顶点在同一个面上,那么它们一定至少有一个坐标是相同的!

举个例子:

  • 顶点 (0, 0, 0) 和 (0, 1, 0) 都在 x=0 的面上,也都在 z=0 的面上。它们的 x 坐标相同,z 坐标也相同。
  • 顶点 (1, 1, 0) 和 (0, 1, 0) 都在 y=1 的面上,也都在 z=0 的面上。它们的 y 坐标相同,z 坐标也相同。

反过来想,如果两只苍蝇,我们叫她们小花 (x1, y1, z1) 和小黑 (x2, y2, z2) 吧,她们的 x, y, z 坐标全都不一样,那会怎么样呢? 比如小花在 (0, 0, 0),小黑在 (1, 1, 1)。

  • x 坐标不同 (0 vs 1)
  • y 坐标不同 (0 vs 1)
  • z 坐标不同 (0 vs 1) 它们处在立方体的两个对角顶点上,中间隔着立方体的“身体”,肯定是互相看不见的啦!

所以,判断它们能不能看见对方,就变成了一个非常简单的问题:只要检查它们的 x, y, z 坐标,看看有没有任意一对是相同的就行啦!

  • 如果 x1 == x2,它们就在同一个 x 平面上,能看见!
  • 或者,如果 y1 == y2,它们就在同一个 y 平面上,能看见!
  • 或者,如果 z1 == z2,它们就在同一个 z 平面上,能看见!

只要满足上面三个条件中的任何一个,答案就是 "YES"。如果三个条件都不满足,答案就是 "NO"。是不是很简单喵?

题解代码

好啦,我们来看看代码是怎么实现这个思路的喵~

cpp
#include <iostream>

// 使用标准命名空间,这样就不用写 std::cin 这么麻烦啦
using namespace std;

int main() {
    // 定义六个整型变量,用来存放两只小苍蝇的坐标
    int x1, y1, z1;
    int x2, y2, z2;

    // 用 cin 从输入中读取第一只苍蝇的坐标
    cin >> x1 >> y1 >> z1;
    // 读取第二只苍蝇的坐标
    cin >> x2 >> y2 >> z2;

    // 这里就是最核心的判断逻辑啦!
    // || 这个符号是“或者”的意思喵
    // 所以这行代码的意思是:如果 x1 等于 x2,或者 y1 等于 y2,或者 z1 等于 z2
    if (x1 == x2 || y1 == y2 || z1 == z2) {
        // 如果上面三个条件中至少有一个成立,就说明它们在同一个面上
        // 输出 "YES"
        cout << "YES" << endl;
    } else {
        // 如果三个条件都不成立(也就是说x, y, z坐标全都不同)
        // 那它们就看不见对方,输出 "NO"
        cout << "NO" << endl;
    }

    // 程序顺利结束,返回0
    return 0;
}

看,是不是超级清晰明了的一段代码呀?主人一定也看懂了吧,喵~

知识点介绍

喵~ 这个问题背后其实藏着一些有趣的数学小知识呢!让本喵来给主人讲讲吧!

  1. 三维笛卡尔坐标系 (3D Cartesian Coordinate System) 我们平时说的 (x, y, z) 坐标,就是笛卡尔坐标系啦。它由三条互相垂直的数轴(x轴、y轴、z轴)组成,就像一个巨大的隐形架子,帮我们精确定位空间里任何一个点的位置,很神奇吧喵?在这个问题里,立方体的棱边正好都和坐标轴平行,这让我们的分析变得特别简单。

  2. 立方体的几何性质 (Geometric Properties of a Cube)

    • 顶点 (Vertex):立方体有8个顶点。在本题中,它们的坐标都是由0和1组合而成的,从 (0,0,0) 到 (1,1,1)。
    • 面 (Face):立方体有6个面。在坐标系中,一个面可以由一个坐标固定不变来定义。例如,x=0 就定义了一个与 yz 平面平行的面。
    • 顶点关系:立方体上任意两个顶点的关系,可以分为三种:
      • 相邻 (Adjacent):两个顶点在同一条棱上。它们的坐标只有一个分量不同,例如 (0,0,0) 和 (0,0,1)。
      • 面对角 (Face Diagonal):两个顶点在同一个面上,但不相邻。它们的坐标有两个分量不同,例如 (0,0,0) 和 (0,1,1)。
      • 体对角 (Space Diagonal):两个顶点是立方体对角线的端点。它们的坐标三个分量都不同,例如 (0,0,0) 和 (1,1,1)。

    题目中说“在同一个面上”,其实就包括了相邻面对角这两种情况。我们的判断条件 x1 == x2 || y1 == y2 || z1 == z2 恰好能完美地覆盖这两种情况!因为只要不是体对角,两个顶点就至少会有一个坐标分量是相同的。

所以呀,只要理解了立方体在坐标系中的表示方法,这个问题就迎刃而解啦!希望本喵的讲解对主人有帮助哦,喵~

Released under the MIT License.