《算法竞赛·快冲300题》每日一题:“立方体表面距离”

news2024/11/16 8:40:44

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

立方体表面距离” ,链接: http://oj.ecustacm.cn/problem.php?id=1139

题目描述

【题目描述】 给定一个立方体,长宽高分别为L,W,H,以立方体一顶点建立空间直角坐标系。有两点A(x1, y1, z1)和B(x2, y2, z2)位于立方体表面上。求两点在立方体表面上的最短距离的平方。
在这里插入图片描述

【输入格式】 输入有多组数据,输入数字依次为L,W,H,x1,y1,z1,x2,y2,z2。0≤L,W,H≤1000,0≤x≤L,0≤y≤W,0≤z≤H。输入保证A、B两点在立方体表面上。
【输出格式】 对于每组数据,输出一行,包含最短距离,答案精确到小数点后0位。
【输入样例】

5 5 2 3 1 2 3 5 0

【输出样例】

36

题解

   如果两点在同一面上,最短距离是它们在平面上的连线。如果两点在不同的两个面上,可以想象立方体是一个纸盒子,把纸盒子展开成一个平面,两点的最短距离是这个平面上的连线。
   本题的重点是立方体展开过程中的坐标变换,读者可以自己设计一种展开方法。
   下面介绍代码中的展开方法,分两个步骤。
   步骤(1)。为方便处理A、B点的关系,把A点移动到底面上,也就是z=0的面。以下图为例,A在y=W的面上,把立方体沿x轴整体右旋90度,那么A点就到了底面上。
在这里插入图片描述
   步骤(2)。把A、B所在的面都展开或旋转到底面上,这样A、B就位于同一个面上。以下图为例,A在底面上,B在y=W的面上。先把立方体沿着x轴右旋90度,B就到了底面上。A原来在底面,现在向左平移W(或者看成从中间图的左侧面向左下展开到底面)。这时A、B都位于底面上。
在这里插入图片描述

【重点】

C++代码

   代码19~34行完成步骤(1),把A点转到底面上。
   函数getAns()完成步骤(2),把A、B所在的面展开到同一个面,然后计算距离。参数i表示绕y轴旋转,参数j表示绕x轴旋转。i和j只变化两次,对应立方体旋转1次或2次。例如第12行“右旋,绕x轴转1~2次”,是上图图示的情况,B在侧面,只转1次就到底面;如果B在z = H的顶面,就需要转2次才能转到底面。

#include<bits/stdc++.h>
using namespace std;
const double INF = 1e20;
double length2(double x1, double y1, double x2, double y2){
    return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
double ans;
void getAns(int i,int j,double x,double y,double x2,double y2,double z2,double L,double W,double H){
if( z2==0 && ans>length2(x,y,x2,y2 ))   ans=length2(x,y,x2,y2 ); //AB在同一个面,计算距离
    if( i>= 0 && i< 2 )  getAns(i+1,j,x+H,y,H-z2,y2,x2,H,W,L);   //后旋,绕y轴转1~2次
    if( i<= 0 && i> -2)  getAns(i-1,j,x-L,y,z2,y2,L-x2,H,W,L);   //前旋,绕y轴转1~2次
    if( j>= 0 && j< 2 )  getAns(i,j+1,x,y-W,x2,z2,W-y2,L,H,W);   //右旋,绕x轴转1~2次
    if( j<= 0 && j> -2)  getAns(i,j-1,x,y+H,x2,H-z2,y2,L,H,W);   //左旋,绕x轴转1~2次
}
int main(){
    double L, W, H;
    double x1, y1, z1, x2, y2, z2;
    while(cin>>L>>W>>H>>x1>>y1>>z1>>x2>>y2>>z2){
        if( z1!=0 && z1!=H){          //A点不在Z=0或Z=H的面上
            if( x1!=0 && x1!=L ){     //A也不在x面上,那么A在y面上
                swap(y1, z1);         //把立方体绕x轴旋转,把A点转到了z面
                swap(y2, z2);
                swap(W, H);
            }
            else {                    //A在x的面上
                swap(x1, z1);         //把立方体绕y轴旋转,把A点转到z面
                swap(x2, z2);
                swap(L, H);
            }
        }
        if( z1==H ){                  //把A点调整到z=0,即底面
            z1 = 0;
            z2 = H-z2;
        }
        ans=INF;
        getAns(0, 0, x1, y1, x2, y2, z2, L, W, H );  //z1=0, A点在z=0的面上。求AB的最短距离
        cout<<(int)round(ans)<<endl;
    }
    return 0;
}

Java代码

import java.util.Scanner;
public class Main {
    private static final double INF = 1e20;
    private static double length2(double x1, double y1, double x2, double y2) {
        return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
    }
    private static double ans;
    private static void getAns(int i,int j,double x,double y,double x2,double y2,double z2,double L, double W, double H) {
        if (z2 == 0 && ans > length2(x, y, x2, y2))    ans = length2(x, y, x2, y2);
        if (i >= 0 && i < 2)   getAns(i + 1, j, x + H, y, H - z2, y2, x2, H, W, L);        
        if (i <= 0 && i > -2)  getAns(i - 1, j, x - L, y, z2, y2, L - x2, H, W, L);
        if (j >= 0 && j < 2)   getAns(i, j + 1, x, y - W, x2, z2, W - y2, L, H, W);
        if (j <= 0 && j > -2)  getAns(i, j - 1, x, y + H, x2, H - z2, y2, L, H, W);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            double L = scanner.nextDouble();
            double W = scanner.nextDouble();
            double H = scanner.nextDouble();
            double x1 = scanner.nextDouble();
            double y1 = scanner.nextDouble();
            double z1 = scanner.nextDouble();
            double x2 = scanner.nextDouble();
            double y2 = scanner.nextDouble();
            double z2 = scanner.nextDouble();
            if (z1 != 0 && z1 != H) {
                if (x1 != 0 && x1 != L) {
                    double temp = y1; y1 = z1;  z1 = temp;    
                    temp = y2;  y2 = z2;  z2 = temp;    
                    temp = W;   W = H;    H = temp;
                } else {
                    double temp = x1;  x1 = z1;   z1 = temp;
                    temp = x2;   x2 = z2;    z2 = temp;
                    temp = L;    L = H;      H = temp;
                }
            }
            if (z1 == H) {
                z1 = 0;
                z2 = H - z2;
            }
            ans = INF;
            getAns(0, 0, x1, y1, x2, y2, z2, L, W, H);
            System.out.println((int) Math.round(ans));
        }
        scanner.close();
    }
}

Python代码

import math
INF = 1e20
def length2(x1, y1, x2, y2):   return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)
def getAns(i, j, x, y, x2, y2, z2, L, W, H):
    global ans
    if z2==0 and ans>length2(x, y, x2, y2):    ans=length2(x, y, x2, y2)
    if i>= 0 and i< 2:     getAns(i+1, j, x+H, y, H-z2, y2, x2, H, W, L)
    if i<= 0 and i> -2:    getAns(i-1, j, x-L, y, z2, y2, L-x2, H, W, L)
    if j>= 0 and j< 2:     getAns(i, j+1, x, y-W, x2, z2, W-y2, L, H, W)
    if j<= 0 and j> -2:    getAns(i, j-1, x, y+H, x2, H-z2, y2, L, H, W)
  
while True:
    try:
        L, W, H, x1, y1, z1, x2, y2, z2 = map(float, input().split())
        if z1!=0 and z1!=H:
            if x1!=0 and x1!=L:
                y1, z1 = z1, y1
                y2, z2 = z2, y2
                W, H = H, W
            else:
                x1, z1 = z1, x1
                x2, z2 = z2, x2
                L, H = H, L
        if z1==H:
            z1=0
            z2=H-z2
        ans = math.inf
        getAns(0, 0, x1, y1, x2, y2, z2, L, W, H)
        print(round(ans))
    except EOFError:
        break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/890304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

作为spring框架的另外的重点AOP的介绍(详细篇)

一.Aop介绍&#xff0c;以及作用范围&#xff0c;和其专业名词的解释 1.什么是Aop&#xff1f; Java Spring中的AOP&#xff08;面向切面编程&#xff09;是一种编程范式&#xff0c;用于通过将与核心业务逻辑无关的横切关注点&#xff08;如日志记录、性能统计、安全控制等&…

BOXTRADE-天启量化分析平台 系统功能预览

BOXTRADE-天启量化分析平台 系统功能预览 系统功能预览 1.登录 首页 参考登录文档 2. A股 行情与策略分析 2.1 A股股票列表 可以筛选和搜索 2.2 A股行情及策略回测 2.2.1 行情数据提供除权和前复权&#xff0c;后复权数据&#xff1b;外链公司信息 2.2.2 内置策略执行结果…

使用 PyTorch 进行高效图像分割:第 2 部分

一、说明 这是由 4 部分组成的系列的第二部分&#xff0c;旨在使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何实现基线图像分割卷积神经网络&#xff08;CNN&#xff09;模型。 图 1&#xff1a;使用 CNN 运行图像分割的结果。按从上到下的顺序…

建筑结构健康监测系统,解锁建筑安全监测新模式

随着现代建筑技术的发展&#xff0c;高层、超高层、大型公共建筑以及桥梁等复杂结构的数量不断增加&#xff0c;对建筑结构监测的要求也日益迫切。万宾建筑结构健康监测系统通过先进的传感技术和和数据分析技术来持续监测建筑的结构健康&#xff0c;这种监测的目的是可以识别建…

Cat(4):API介绍—Transaction

1 基本用法 Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用&#xff0c;数据库调用&#xff0c;也适合执行时间较长的业务逻辑监控&#xff0c;Transaction用来记录一段代码的执行时间和次数。 现在我们的框架还没有与dubbo、mybatis做集成&#xff0c;所以我…

网络协议的定义、组成和重要性?

什么是网络协议&#xff1f; 网络协议是在计算机网络中&#xff0c;用于规定通信实体之间进行数据传输和通信的规则集合。网络协议涵盖了各种通信细节&#xff0c;包括数据包格式、错误处理、数据传输速率等&#xff0c;是用于分组交换数据网络的一种协议&#xff0c;其任务仅…

Linux:shell脚本:基础使用(4)《正则表达式-grep工具》

正则表达式定义&#xff1a; 使用单个字符串来描述&#xff0c;匹配一系列符合某个句法规则的字符串 正则表达式的组成&#xff1a; 普通字符串: 大小写字母&#xff0c;数字&#xff0c;标点符号及一些其他符号 元字符&#xff1a;在正则表达式中具有特殊意义的专用字符 正则表…

发掘Win10神奇工具:计划任务程序的自动化魔力

在Windows 10系统中&#xff0c;隐藏着许多不为人知的神奇工具&#xff0c;您了解多少呢&#xff1f;想象一下&#xff0c;如果有一种工具&#xff0c;能够像机器人一样在您设定的时间自动执行各种任务&#xff0c;您会不会觉得它是一件非常实用的利器&#xff1f;今天&#xf…

算法通关村第4关【黄金】| 表达式问题

1. 计算器问题 思路&#xff1a;此题不考虑括号和负数情况&#xff0c;单纯使用栈即可解决。注意的是数字可能是多位数需要保留完整的num&#xff0c; 保留数字的前缀符号&#xff0c;当碰到加号&#xff0c;存进去&#xff1b;当碰到减号&#xff0c;存相反数进去&#xff1b;…

【算法系列篇】双指针

文章目录 前言什么是双指针算法1.移动零1.1 题目要求1.2 做题思路1.3 Java代码实现 2.复写零2.1 题目要求2.2 做题思路2.3 Java代码实现 3.快乐数3.1 题目要求3.2 做题思路3.3 Java代码实现 4.盛最多水的容器4.1 题目要求4.2 做题思路4.3 Java代码实现 5.有效三角形的个数5.1 题…

Windows 10 20H2升级至Windows 11

关于Windows 10 20H2和21H1版本结束支持 在Windows 10中&#xff0c;20H2版本是Windows 10的第十个主要更新。此次升级于2020年10月20日上线。 2020年10月更新中的显著变化包括开始菜单、Microsoft Edge的改进、新的可自定义体验、通知体验的增强等。 然而&#…

Windows防火墙屏蔽恶意TCP连接

关闭所有软件(except 安全)&#xff0c;wireshark抓包 set filtertcp&#xff0c;抓取所有tcp包&#xff0c; 抓包文件导出为tcp.txt 过滤出ip address 去掉文件头尾&#xff0c;执行以下程序获得ip address #cut_file.py def copy_first_10_chars(input_file, output_fil…

展会预告 | 图扑与您相约用友 2023 全球商业创新大会

为汇聚商业智慧&#xff0c;释放企业潜能&#xff0c;深入推动企业数智化转型升级&#xff0c;创新客户价值&#xff0c;让数智化在更多的企业成功&#xff0c;由用友主办的“2023 全球商业创新大会”&#xff0c;将于本月 8 月 18 日至 20 日&#xff0c;在上海市“国家会展中…

IT运维:使用数据分析平台监控深信服防火墙(进阶)

概述 本文主要在原文档基础上&#xff0c;进行了字段抽取规则、图表的优化。 字段抽取&#xff1a;原文档使用正则的方式&#xff0c;创建了多个视图&#xff0c;本文将改为正则键值的抽取方式&#xff0c;并介绍键值抽取的适用场景 图表的优化&#xff1a;原文使用多为简单的…

56.linux 进程管理命令和用户管理命令

目录 一、进程管理命令 1.ps 2.pstree 3.kill 4.pkill 5.&后台运行程序 6.jobs 7.fg bg 8.top 二、用户管理命令 1.系统存储用户信息的文件 2.添加新用户 3.修改用户密码 4.删除用户 一、进程管理命令 1.ps 用于查看当前系统中运行的进程信息。它可以…

thinkphp开发的在线学习培训考试模拟考试做题练习系统带商城功能证书管理课程系统

thinkphp开发的在线学习培训考试模拟考试做题练习系统带商城功能证书管理课程系统 1、做题界面 2、前端UI的展示 3、带商城购物功能

springboot 通过博途获取plc点位的数据

springboot 通过博途获取plc点位的数据 maven依赖<dependency><groupId>com.github.dathlin</groupId><artifactId>HslCommunication</artifactId><version>3.6.0</version> </dependency>这个版本尽量是新版本&#xff0c;不…

微服务-GateWay(网关)

所谓网关是什么意思&#xff1f; 相当于就是你们小区家的保安&#xff0c;进出小区都得获得保安的同意&#xff0c;守护你们小区的生命财产健康&#xff0c;网关也是如此&#xff0c;对每个请求都严格把关&#xff0c;将合法的或者是获得权限的请求进入服务器 网关的功能&…

【CTF-web】bugku-成绩查询(sql注入)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/84.html 判断注入点 查看网页源码可知输入数据通过POST发送到index.php并显示出查询结果&#xff0c;可能需要sql注入。 如上图所示&#xff0c;当id为1时返回名字为“龙龙龙”的成绩单。 再测试&#xff0c…

创建第一个任务源码解析

经过上面的操作以后我们就可以启动第一个任务了&#xff0c;函数 prvStartFirstTask()用于启动第一 个任务&#xff0c;这是一个汇编函数&#xff0c;函数源码如下&#xff1a; __asm void prvStartFirstTask( void ) { PRESERVE8 ldr r0, 0xE000ED08 ;R00XE000ED08 (1) ldr r…