题目描述
边长为1正方体(自行脑补),有一只蚂蚁要从上表面上的一点出发爬往下表面的某一点,规定蚂蚁只能沿正方体表面爬行,要求编程求出一条从起点到终点的最短距离。
起点和终点坐标从键盘输入,设定上下两个表面的坐标原点均为正方形的中心,且两个表面的坐
标系的X轴和Y轴方向一致,输出时保留三位小数。
输入格式
4 个实数(-0.5 到 0.5 之间),分别表示出发点和目的点的坐标。
输出格式
最短距离
输入输出样例
输入 #1复制
0.26 0.50 0.50 0.18输出 #1复制
1.146
题目类型:模拟,计算几何。
解题思路:寻找可能的路径,一一计算,寻找最小值。
注意点:折叠后上下两个表面的坐标原点均为正方形的中心,且两个表面的坐标系的X轴和Y轴方向一致。
1)4种情况起点和终点所在的方块在同一行或同一列内,两者连线穿过一个无关方块。
2)8种情况起点和终点所在的方块不在同一行或同一列内,两者的连线穿过两个无关方块。
3)以起点为最终坐标系, 将终点坐标系 转换成 起点坐标系中的点。
4)计算起点与终点直线距离。
AC代码:
#include <bits/stdc++.h>
#define rep(x ,a, b) for(int x =a; x<=b; x++)
#define inf 0x3f3f3f3f
using namespace std;
double ans = inf;
double xx1, xx2, yy1, yy2 ;
void calculate(double xt, double yt)
{
double s = sqrt((xt - xx1)*(xt-xx1) + (yt-yy1)*(yt-yy1));
//cout<<s<<endl;
ans = min(s, ans);
}
int main()
{
scanf("%lf%lf%lf%lf", &xx1, &yy1, &xx2, &yy2);
//4种 上下左右;
calculate(xx2, -2-yy2);
calculate(xx2, 2-yy2);
calculate(-2-xx2, yy2);
calculate(2-xx2, yy2);
//8种右上2种, 右下2种, 左下2种, 左上2种
calculate(yy2+2, xx2-1);
calculate(yy2+1, xx2-2);
calculate(yy2-1, xx2+2);
calculate(yy2-2, xx2+1);
calculate(1-yy2, 2-xx2);
calculate(2-yy2, 1-xx2);
calculate(-1-yy2, -2-xx2);
calculate(-2-yy2, -1-xx2);
printf("%.3lf", ans);
return 0;
}