P2358 蚂蚁搬家

题目描述

边长为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;
 } 

猜你喜欢

转载自blog.csdn.net/m0_54674275/article/details/121384039